¿La lista garantiza el orden de inserción?

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 a veces obtengo resultados extraños; a veces el orden es incorrecto o los elementos de la lista se eliminan.

¿Algunas ideas? ¿ List orden de garantía de List ?

Relacionado:

¿Una lista garantiza que los artículos serán devueltos en el orden en que fueron agregados?

La clase List<> 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.

De acuerdo con MSDN:

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

Los valores de índice deben seguir siendo confiables para que esto sea preciso. Por lo tanto, la orden está garantizada.

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

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

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

 0 1 2 3 KCAE 

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

Entonces quita el elemento 0 primero, dejando

 0 1 2 CAE 

Luego insertas a las 3

 0 1 2 3 CAEK 

Para obtener el resultado correcto, debería 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 tu problema. Tenga en cuenta que mi código no ha sido probado.

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

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

Este es el código que tengo para mover un elemento hacia abajo un lugar en 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 una List , pero hereda de IList por lo que debe comportarse igual. ¿Esto ayuda?

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

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 elimínelo de su primera posición. Asegúrese de eliminarlo por su índice, porque si lo va a eliminar por referencia, puede eliminarlos ambos …