List <T>保证插入顺序吗?

假设我在列表中有3个string(例如“1”,“2”,“3”)。

然后我想重新排列它们在位置1处放置“2”(例如“2”,“1”,“3”)。

我正在使用此代码(将indexToMoveTo设置为1):

listInstance.Remove(itemToMove); listInstance.Insert(indexToMoveTo, itemToMove); 

这似乎工作,但我偶尔会得到奇怪的结果; 有时订单不正确或者列表中的项目被删除!

有任何想法吗? List<T>保证顺序吗?

有关:

List <T>是否保证项目将按照他们添加的顺序返回?

List<>类确保sorting – 事物将按照添加它们的顺序保留在列表中,包括重复项,除非您明确地对列表进行sorting。

如果您稍后在列表中移动项目,则可能会从代码中得到奇怪的结果,因为在调用Insert()之前, Remove()会将所有其他项目向下移动一个位置。

你可以把你的代码烧到足够小的东西来发布?

这里有4个项目,其索引

 0 1 2 3 KCAE 

你想把K移动到A和E之间 – 你可能会想到位置3.你在这里注意你的索引,因为在移除之后,所有的索引都会被更新。

所以你先删除第0项,然后离开

 0 1 2 CAE 

然后你在3插入

 0 1 2 3 CAEK 

为了得到正确的结果,你应该使用索引2.为了使事情一致, if indexToMoveTo > indexToMove ,你将需要发送到(indexToMoveTo-1),例如

 bool moveUp = (listInstance.IndexOf(itemToMoveTo) > indexToMove); listInstance.Remove(itemToMove); listInstance.Insert(indexToMoveTo, moveUp ? (itemToMoveTo - 1) : itemToMoveTo); 

这可能与您的问题有关。 注意我的代码是未经testing的!

编辑 :或者,您可以Sort与自定义比较器( IComparer ),如果这适用于您的情况。

正如Bevan所说,但请记住,列表索引是基于0的。 如果要将元素移动到列表的前面,则必须将其插入索引0(不是1,如示例所示)。

这是我有一个项目移动到列表中的一个地方的代码:

 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> ,但是它inheritance自IList所以它的行为应该是一样的。 这有帮助吗?

当然,只有当select的项目不是列表中的最后一个项目时,前者才起作用,而如果select的项目不是第一个项目,后者才起作用。

如果您要更改操作顺序,您将避免奇怪的行为:首先将值插入列表中的正确位置,然后从第一个位置删除它。 确保你删除了他的索引,因为如果你将通过引用删除它,你可能会删除它们两个…