¿List<T> garantiza el orden de inserció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 (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?
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?
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 Sort
utilizar un comparador personalizado ( IComparer
) si es aplicable a su situación.