¿List<T> garantiza el orden de inserción?

Resuelto SuperSuperDev1234 asked hace 15 años • 5 respuestas

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 (estableciendo 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 se eliminan elementos de la lista!

¿Algunas ideas? ¿ Garantiza List<T>el pedido?

Relacionado:

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

SuperSuperDev1234 avatar Jun 25 '09 17:06 SuperSuperDev1234
Aceptado

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

Según MSDN:

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

Los valores del índice deben seguir siendo fiables para que esto sea exacto. Por 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 moverá Remove()todos los demás elementos hacia abajo un lugar antes de llamar a Insert().

¿Puedes reducir tu código a algo lo suficientemente pequeño como para publicarlo?

Bevan avatar Jun 25 '2009 10:06 Bevan

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

0  1  2  3
K  C  A  E

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

Entonces eliminas el elemento 0 primero, dejando

0  1  2
C  A  E

Luego insertas en 3

0  1  2  3
C  A  E  K

Para obtener el resultado correcto, debería haber utilizado el índice 2. Para que las cosas sean coherentes, 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 Sortutilizar un comparador personalizado ( IComparer) si es aplicable a su situación.

Joel Goodwin avatar Jun 25 '2009 10:06 Joel Goodwin