Entonces tengo una lista genérica, y un oldIndex
y un newIndex
valor.
Quiero mover el elemento a oldIndex
, a newIndex
... lo más simple posible.
¿Alguna sugerencia?
Nota
El elemento debe terminar entre los elementos en (newIndex - 1)
y newIndex
antes de ser eliminado.
newIndex--
tiene no produce el comportamiento que dijiste que querías.ObservableCollection
y no es un genéricoList<T>
, pero es trivial simplemente intercambiar las llamadas a métodos para obtener el mismo resultado.[newIndex - 1]
y[newIndex]
no es invertible.Move(1, 3); Move(3, 1);
no devuelve la lista al estado inicial. Mientras tanto, hay un comportamiento diferente proporcionadoObservableCollection
y mencionado en esta respuesta , que es invertible .Respuestas:
Sé que dijiste "lista genérica" pero no especificaste que necesitabas usar la clase Lista (T) , así que aquí hay una oportunidad de algo diferente.
La clase ObservableCollection (T) tiene un método Move que hace exactamente lo que desea.
Debajo se implementa básicamente de esta manera.
Como puede ver, el método de intercambio que otros han sugerido es esencialmente lo que hace ObservableCollection en su propio método Move.
ACTUALIZACIÓN 2015-12-30: Puede ver el código fuente de los métodos Move y MoveItem en corefx ahora sin usar Reflector / ILSpy ya que .NET es de código abierto.
fuente
fuente
newIndex
realidad rompe mi prueba (ver mi respuesta a continuación).lock
declaración.Sé que esta pregunta es antigua, pero adapté ESTA respuesta del código de JavaScript a C #. Espero eso ayude
fuente
List <T> .Remove () y List <T> .RemoveAt () no devuelven el elemento que se está eliminando.
Por lo tanto, debes usar esto:
fuente
Inserte el elemento actualmente en
oldIndex
estar ennewIndex
y luego elimine la instancia original.Debe tener en cuenta que el índice del elemento que desea eliminar puede cambiar debido a la inserción.
fuente
Creé un método de extensión para mover elementos en una lista.
Un índice no debe cambiar si estamos moviendo un elemento existente ya que estamos moviendo un elemento a una posición de índice existente en la lista.
El caso extremo al que @Oliver se refiere a continuación (mover un elemento al final de la lista) en realidad provocaría que las pruebas fallaran, pero esto es por diseño. Para insertar un nuevo elemento al final de la lista, simplemente llamaríamos
List<T>.Add
.list.Move(predicate, list.Count)
debería fallar ya que esta posición de índice no existe antes del movimiento.En cualquier caso, he creado dos métodos de extensión adicionales
MoveToEnd
yMoveToBeginning
la fuente de los cuales se puede encontrar aquí .fuente
Ensure.Argument
define?List<T>
, puede llamarInsert(list.Count, element)
para colocar algo al final de la lista. EntoncesWhen_new_index_is_higher
debería llamar, lolist.Move(x => x == 3, 5)
que realmente falla.List<T>
, simplemente llamaría.Add
para insertar un nuevo elemento al final de una lista. Al mover elementos individuales, nunca aumentamos el tamaño original del índice, ya que solo eliminamos un solo elemento y lo volvemos a insertar. Si hace clic en el enlace en mi respuesta, encontrará el código paraEnsure.Argument
.Yo esperaría cualquiera:
... o:
... haría el truco, pero no tengo VS en esta máquina para verificar.
fuente
newIndex
si es posterioroldIndex
.La forma más simple:
EDITAR
La pregunta no está muy clara ... Como no nos importa a dónde
list[newIndex]
va el artículo, creo que la forma más sencilla de hacerlo es la siguiente (con o sin un método de extensión):Esta solución es la más rápida porque no implica inserciones / eliminaciones de listas.
fuente
Es más simple, chicos, solo hagan esto
Haga lo mismo con MoveDown pero cambie if para "if (ind! = Concepts.Count ())" y Concepts.Insert (ind + 1, item.ToString ());
fuente
Así es como implementé un método de extensión de elemento de movimiento. Maneja el movimiento antes / después y hasta los extremos para elementos bastante bien.
fuente