2010-04-04 10 views
13

¿Cómo se crearía un método que tomara un número entero i, y moviera el miembro de List<T> desde su posición actual al inicio de la lista al i?Mover un miembro de una lista al frente de la lista

+0

Está intentando ordenarlo, ¿verdad? – vittore

+0

¿Tendría que ordenarlo para hacer eso? Solo quiero mover el miembro ONE al índice i, al principio de la lista. No es necesario que mueva el resto. – Shonna

+0

Le habría dado un voto positivo, pero no seleccionó la respuesta obvia. Lo sentimos :(. –

Respuesta

25

La clase List<T> no ofrece un procedimiento de este tipo, pero se puede escribir un método de extensión que recibe el artículo, lo elimina y finalmente re-inserciones que:

static class ListExtensions 
{ 
    static void MoveItemAtIndexToFront<T>(this List<T> list, int index) 
    { 
     T item = list[index]; 
     list.RemoveAt(index); 
     list.Insert(0, item); 
    } 
} 
+0

Niza extensión. – vittore

+0

el encabezado para el método se supone que es así: public void MoveToFront (int i) – Shonna

+15

Bien, ya que _conoce_ la firma, estoy afirmando audazmente que esto es una tarea. Etiquetarlo como la próxima vez. –

4
var l = new List<DataItem>(); 
var temp = l[index]; 
l.RemoveAt(index); 
l.Insert(0, temp); 
2

probar este

static List<int> idList = new List<int>() { 1, 2, 4, 5, 6, 8, 9 }; 

    private static void moveListItem(int index) 
    { 
     int getIndex = 0; 

     foreach (int item in idList) 
     { 
      Console.WriteLine(" Before Id List Value - {0} ,Index - {1} ", item.ToString(), getIndex); 
      getIndex++; 
     } 

     int value = idList[index]; 
     idList.RemoveAt(index); 
     idList.Insert(0, value); 

     Console.WriteLine(); 

     getIndex = 0; 
     foreach (int item in idList) 
     { 
      Console.WriteLine(" After Id List Value - {0} ,Index - {1} ", item.ToString(), getIndex); 
      getIndex++; 
     } 
    } 
7

Cualquiera de las 3 respuestas hasta ahora funciona, pero en lugar de hacer una operación Eliminar y Insertar, sugiero mover cada elemento un lugar a la derecha desde las posiciones deseadas, al comienzo de la lista. De esa forma evitará mover los artículos colocados a la derecha del artículo movido.

Esta es una modificación de la respuesta de @dtb.

static class ListExtensions 
{ 
    static void MoveItemAtIndexToFront<T>(this List<T> list, int index) 
    { 
     T item = list[index]; 
     for (int i = index; i > 0; i--) 
      list[i] = list[i - 1]; 
     list[0] = item; 
    } 
} 
+0

Para un método de extensión, esto tendría más sentido ya que es más rápido en promedio que el método de dtb. – Groo

+0

@Groo ¿Es siempre más rápido, incluso para listas más grandes? – Coops

+0

@CodeBlend: sí, para mayor lista la diferencia sería más pronunciada, aunque no puedo afirmar que notará una y diferencia en la práctica. Teóricamente, este método y dtb son ambos 'O (n)', pero en la respuesta de dtb 'list.RemoveAt' primero eliminará el elemento y luego copiará todos los elementos siguientes un lugar hacia atrás, y luego' list.Insert (0, item) 'volverá a insertar el ítem en el índice' 0' y luego copiará todos los ítems hacia delante en 1 posición. El método de Fede, por otro lado, solo hace un barrido hacia atrás (número de intercambios iguales a 'índice'). – Groo

0

A riesgo de leña del árbol caído:

No sería una LinkedList ser más adecuado para esto? Aunque perdería la funcionalidad de acceso aleatorio, insertar elementos al principio de la lista sería mucho más simple (.AddFirst) y mucho más eficiente.

Cuestiones relacionadas