remarks exceptions example c# .net collections

c# - exceptions - ¿La Lista<T> garantiza el orden de inserción?



params comments c# (5)

Aquí hay 4 artículos, con su índice.

0 1 2 3 K C A E

Desea mover K entre A y E: puede pensar en la posición 3. Debe tener cuidado con su indexación aquí, porque después de la eliminación, todos los índices se actualizan.

Así que eliminas el artículo 0 primero, dejando

0 1 2 C A E

Luego se inserta a las 3

0 1 2 3 C A E K

Para obtener el resultado correcto, debe haber usado el índice 2. Para que las cosas sean consistentes, deberá enviar a (indexToMoveTo-1) if indexToMoveTo > indexToMove , por ejemplo

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

Esto puede estar relacionado con su problema. Tenga en cuenta que mi código no ha sido probado!

EDITAR : Alternativamente, puede Sort con un comparador personalizado ( IComparer ) si es aplicable a su situación.

Digamos que tengo 3 cadenas en una lista (por ejemplo, "1", "2", "3").

Luego quiero reordenarlos para colocar "2" en la posición 1 (por ejemplo, "2", "1", "3").

Estoy usando este código (configurando indexToMoveTo en 1):

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

Esto parece funcionar, pero ocasionalmente obtengo resultados extraños; ¡A veces el orden es incorrecto o los elementos de la lista se eliminan!

¿Algunas ideas? ¿La List<T> garantiza el pedido?

Relacionado:

¿Una Lista <T> garantiza que los artículos se devolverán en el orden en que se agregaron?


Como dijo Bevan, pero tenga en cuenta que el índice de lista se basa en 0. Si desea mover un elemento al frente de la lista, debe insertarlo en el índice 0 (no 1 como se muestra en su ejemplo).


Este es el código que tengo para mover un artículo hacia abajo en un lugar de una lista:

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; }

Y esto para moverlo un lugar hacia arriba:

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 es un ListBox por supuesto, por lo que la lista es un ListBox.ObjectCollection , no un List<T> , pero se hereda de IList por lo que debería comportarse de la misma manera. ¿Esto ayuda?

Por supuesto, el primero solo funciona si el elemento seleccionado no es el último elemento de la lista y el último si el elemento seleccionado no es el primer elemento.


La clase List<> garantiza el ordenamiento: las cosas se conservarán en la lista en el orden en que las agregue, incluidos los duplicados, a menos que ordene la lista explícitamente.

Según MSDN:

... Lista "Representa una lista fuertemente tipada de objetos a los que se puede acceder por índice ".

Los valores del índice deben seguir siendo confiables para que esto sea preciso. Por lo tanto el orden está garantizado.

Es posible que obtenga resultados extraños de su código si mueve el elemento más adelante en la lista, ya que Remove() moverá todos los demás elementos un lugar antes de la llamada a Insert() .

¿Puede reducir su código a algo lo suficientemente pequeño como para publicar?


Si va a cambiar el orden de las operaciones, evitará el comportamiento extraño: primero inserte el valor en el lugar correcto de la lista y luego elimínelo de su primera posición. Asegúrese de eliminarlo por su índice, ya que si lo elimina por referencia, puede eliminarlos a ambos ...