假设我在一个列表中有3个字符串(例如:“1”、“2”、“3”)。
然后我想把它们重新排序,把“2”放在位置1(例如。“1”“2”,“3”)。
我正在使用这段代码(设置indexToMoveTo为1):
listInstance.Remove(itemToMove);
listInstance.Insert(indexToMoveTo, itemToMove);
这似乎有效,但我偶尔会得到奇怪的结果;有时顺序不正确,或者列表中的项目被删除!
什么好主意吗?List<T>是否保证有序?
相关:
List<T>是否保证项目将按照添加的顺序返回?
这是我在列表中向下移动一项的代码:
if (this.folderImages.SelectedIndex > -1 && this.folderImages.SelectedIndex < this.folderImages.Items.Count - 1)
{
string imageName = this.folderImages.SelectedItem as string;
int index = this.folderImages.SelectedIndex;
this.folderImages.Items.RemoveAt(index);
this.folderImages.Items.Insert(index + 1, imageName);
this.folderImages.SelectedIndex = index + 1;
}
这是为了把名次提升一位
if (this.folderImages.SelectedIndex > 0)
{
string imageName = this.folderImages.SelectedItem as string;
int index = this.folderImages.SelectedIndex;
this.folderImages.Items.RemoveAt(index);
this.folderImages.Items.Insert(index - 1, imageName);
this.folderImages.SelectedIndex = index - 1;
}
folderImages当然是一个ListBox,所以列表是一个ListBox。ObjectCollection,不是List<T>,但它继承自IList,所以它的行为应该是一样的。这有用吗?
当然,前者仅在所选项目不是列表中的最后一个项目时有效,后者仅在所选项目不是列表中的第一个项目时有效。
以下是4项,以及它们的索引
0 1 2 3
K C A E
你想把K移到A和E之间,你可能认为是位置3。这里要小心索引,因为删除之后,所有索引都会更新。
所以你先去掉第0项,留下
0 1 2
C A E
然后在3处插入
0 1 2 3
C A E K
为了得到正确的结果,应该使用索引2。为了使事情一致,你将需要发送到(indexToMoveTo-1)如果indexToMoveTo > indexToMove,例如。
bool moveUp = (listInstance.IndexOf(itemToMoveTo) > indexToMove);
listInstance.Remove(itemToMove);
listInstance.Insert(indexToMoveTo, moveUp ? (itemToMoveTo - 1) : itemToMoveTo);
这可能与你的问题有关。请注意,我的代码未经测试!
编辑:或者,如果适用于您的情况,您可以使用自定义比较器(IComparer)进行排序。