所以我有一个通用列表,一个oldIndex
和一个newIndex
值.
我想尽可能简单地将项目移动oldIndex
到newIndex
......
有什么建议?
该项目应该在删除之前(newIndex - 1)
和newIndex
之前的项目之间结束.
我知道你说过"通用列表",但是你没有指定你需要使用List(T)类,所以这里是一个不同的镜头.
的的ObservableCollection(T)类有一个Move方法,你想要做什么.
public void Move(int oldIndex, int newIndex)
它下面基本上是这样实现的.
T item = base[oldIndex]; base.RemoveItem(oldIndex); base.InsertItem(newIndex, item);
因此,您可以看到其他人建议的交换方法基本上就是ObservableCollection在其自己的Move方法中所做的工作.
UPDATE二○一五年十二月三十○日:你可以看到在源代码中移动和移动选项中corefx方法现在为自己没有使用反射/自.NET ILSpy是开源的.
var item = list[oldIndex]; list.RemoveAt(oldIndex); if (newIndex > oldIndex) newIndex--; // the actual index could have shifted due to the removal list.Insert(newIndex, item);
我知道这个问题已经过时但是我将这个 javascript代码的响应改编为C#.希望能帮助到你
public static void Move(this List list, int oldIndex, int newIndex) { // exit if possitions are equal or outside array if ((oldIndex == newIndex) || (0 > oldIndex) || (oldIndex >= list.Count) || (0 > newIndex) || (newIndex >= list.Count)) return; // local variables var i = 0; T tmp = list[oldIndex]; // move element down and shift other elements up if (oldIndex < newIndex) { for (i = oldIndex; i < newIndex; i++) { list[i] = list[i + 1]; } } // move element up and shift other elements down else { for (i = oldIndex; i > newIndex; i--) { list[i] = list[i - 1]; } } // put element from position 1 to destination list[newIndex] = tmp; }
List
因此你必须使用这个:
var item = list[oldIndex]; list.RemoveAt(oldIndex); list.Insert(newIndex, item);
插入该项目目前oldIndex
是在newIndex
然后删除原始实例。
list.Insert(newIndex, list[oldIndex]); if (newIndex <= oldIndex) ++oldIndex; list.RemoveAt(oldIndex);
您必须考虑到要删除的项目的索引可能会由于插入而发生变化。