Digamos que tengo 3 cadenas en una lista (por ejemplo, "1", "2", "3").
Entonces 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 pedido es incorrecto o se eliminan elementos de la lista!
¿Algunas ideas? ¿ List<T>
Garantiza el orden?
Relacionado:
¿Una Lista <T> garantiza que los artículos serán devueltos en el orden en que se agregaron?
c#
.net
collections
SuperSuperDev1234
fuente
fuente
Respuestas:
La
List<>
clase garantiza el orden: las cosas se mantendrán en la lista en el orden en que las agregue, incluidos los duplicados, a menos que ordene explícitamente la lista.De acuerdo con MSDN:
Los valores del índice deben seguir siendo confiables para que esto sea preciso. Por lo tanto, el pedido está garantizado.
Es posible que obtenga resultados extraños de su código si mueve el elemento más adelante en la lista, ya
Remove()
que moverá todos los demás elementos un lugar antes de la llamadaInsert()
.¿Puedes reducir tu código a algo lo suficientemente pequeño como para publicar?
fuente
List
en cualquier buen libro de texto de informática. Al igual queQueue
yStack
, aList
es una estructura de datos bien definida, predecible y bien entendida, si la implementación de .NET difería (o si cambia) , se rompería una gran cantidad de software.Where()
método LINQ para filtrar la lista, confía en la implementación para considerar los elementos de la secuencia en orden. Sucede que sí (consulte referencesource.microsoft.com/System.Core/System/Linq/… ), pero esto no está documentado en MSDN. Sugeriría usaremp.LastOrDefault(x => x.empDept = 'abc')
como la documentación deLastOrDefault()
sí indica que mantiene el orden de los artículos.Aquí hay 4 artículos, con su índice
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.
Entonces eliminas el artículo 0 primero, dejando
Luego inserta a las 3
Para obtener el resultado correcto, debería haber usado el índice 2. Para hacer las cosas consistentes, deberá enviar a (indexToMoveTo-1)
if indexToMoveTo > indexToMove
, por ejemploEsto puede estar relacionado con su problema. ¡Tenga en cuenta que mi código no ha sido probado!
EDITAR : Alternativamente, podría
Sort
hacerlo con un comparador personalizado (IComparer
) si eso es aplicable a su situación.fuente
Como dijo Bevan, pero tenga en cuenta que el índice de lista está basado en 0. Si desea mover un elemento al principio de la lista, debe insertarlo en el índice 0 (no 1 como se muestra en su ejemplo).
fuente
Este es el código que tengo para mover un elemento hacia abajo un lugar en una lista:
y esto para moverlo un lugar hacia arriba:
folderImages
es unListBox
, por lo tanto, la lista es unListBox.ObjectCollection
, no unList<T>
, pero hereda de,IList
por lo que debería comportarse igual. ¿Esto ayuda?Por supuesto, el primero solo funciona si el elemento seleccionado no es el último elemento de la lista y el segundo si el elemento seleccionado no es el primer elemento.
fuente
Si cambia el orden de las operaciones, evitará el comportamiento extraño: primero inserte el valor en el lugar correcto de la lista y luego bórrelo de su primera posición. Asegúrese de eliminarlo por su índice, porque si lo eliminará por referencia, podría eliminarlos a ambos ...
fuente