我试图得到这种排序算法的逻辑,但我真的无法得到它,也许我不够聪明......
我有一个清单。此列表已排序,假设我有 10 个项目。
现在用户选择将第 9 个项目放置到第 4 个位置。
该怎么办?
我的点子:
- 9. 把物品放在一个临时对象里。
- 将 8 项放置到位 9
- 将 7 项放置到位 8
- 将 6 项放置到位 7
- 将 5 项放置到位 6
- 将 4 项放置到位 5
- 将 9 项放置到位 4
这个想法正确吗?
看起来你在谈论轮换。这是一篇包含几个想法的帖子,并对各种方法的优缺点进行了体面的讨论:
这是使用 SortedList 的示例。您也可以只制作一个列表并在其上调用 Sort()。
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace sorter
{
class Program
{
static void Main(string[] args)
{
var list = new SortedList();
var item = new SomeItem(1);
list.Add(item.Value, item);
item = new SomeItem(8);
list.Add(item.Value, item);
item = new SomeItem(2);
list.Add(item.Value, item);
item = new SomeItem(4);
list.Add(item.Value, item);
for (int i = 0; i < list.Count; i++)
{
Console.WriteLine(list.GetByIndex(i));
}
Console.ReadLine();
}
}
public class SomeItem
{
public int Value;
public SomeItem(int value)
{
Value = value;
}
public override string ToString()
{
return Value.ToString();
}
}
}
做所有这些单独的动作将是低效的,一个更好的方法是用单一的方法来做对象的跨度Array.Copy
。
我将使用数组而不是列表,就好像你正在使用List<T>
你可以使用RemoveAt
和Insert
public static void MoveIndex<T>(this T[] array, int sourceIndex, int destIndex)
{
//Some sanity checks before we start.
var arrayLength = array.Length;
if(sourceIndex >= arrayLength || destIndex >= arrayLength || sourceIndex < 0 || destIndex < 0)
throw new IndexOutOfRangeException("The indexes must be within the array);
if(sourceIndex == destIndex)
throw new ArgumentException("The two indexes must not have the same value");
//Store for later useage
var temp = array[sourceIndex];
int offset;
int length;
//Figure out if we are moving left or right
if(souceIndex < destIndex)
{
offset = -1;
length = destIndex - sourceIndex;
}
else
{
offset = 1;
length = sourceIndex - destIndex;
}
//"Move" the elements that need shifting
Array.Copy(array, sourceIndex, array, sourceIndex + offset, length);
//put back the item that we stored earlier;
array[destIndex] = temp;
}
如果你可以让你的收藏成为一个ObservableCollection<T>
它在它的移动功能中内置了这个