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的项目不是第一个项目,后者才起作用。
如果您要更改操作顺序,您将避免奇怪的行为:首先将值插入列表中的正确位置,然后从第一个位置删除它。 确保你删除了他的索引,因为如果你将通过引用删除它,你可能会删除它们两个…