2012-05-10 69 views
7

Tengo una lista de elementos, sin embargo, si el número de elementos de lista es mayor que 4, quiero eliminar todos los elementos pero dejar los primeros 4 solo en la lista.C# - Lista - eliminar todos los elementos pero NO los primeros

Ejemplo:

Lista <> - 1, 2, 3, 4, 5, 6, 7, 8

La nueva lista debería ser - 1,2,3,4

estoy buscando en el uso de List.removeAll(), pero no está seguro de qué poner en los paréntesis

Mirando hacia adelante a un poco de ayuda ....

Steven

Respuesta

15

Por qué no usar List.RemoveRange:

if (list.Count > 4) 
{ 
    list.RemoveRange(4, list.Count - 4); 
} 

(Eso suponiendo que desea a mutar la lista existente. Si está contento creando una secuencia nueva, definitivamente usaría list.Take(4) según la sugerencia de Adam, con o sin la llamada ToList. En estos días tienden a construir consultas en lugar de la mutación de las colecciones existentes)

+0

la differnce es que se cambia la lista original aquí ... – Tigran

+0

+1 por responder la pregunta directamente, pero estoy de acuerdo con el sentimiento de su consulta. Encuentro que se necesita una lista/matriz/nueva colección sobre un enumerable en cada vez menos instancias en estos días. –

+0

@jon para aclarar este método eliminará los elementos de la lista dejando solo los primeros cuatro. Si es así, esto es perfecto, gracias :) – swade1987

9

Como alternativa, puede crear una nueva lista con los objetos de la edad:.

var firstFour = myList.Take(4).ToList(); 

Esto crea una lista nueva, sin embargo, por lo es no lo mismo que eliminar de la lista original.

O si todo lo que necesita hacer es iterar ellos, simplemente Take sin ToList dentro de un foreach:

foreach (var item in myList.Take(4)) 

A continuación, obtener ejecución diferida y no está pasando memoria en la creación de listas.

Así como una nota al margen, con extensiones de LINQ y LINQ encuentro el código declara su intención más explícitamente: list.Take(4) lee mucho más fácil que list.RemoveRange(4, list.Count - 4); a simple vista. La intención en el código es muy importante para el mantenimiento y el trabajo en equipo.

0

Utilice Take de LINQ.

myList = myList.Take(4).ToList() 

Esto toma los primeros 4 elementos de su lista y asigna una nueva lista en lugar de su lista anterior.

No es necesario verificar la longitud como en otras respuestas porque "Tomar enumera la fuente y arroja elementos hasta que los elementos de recuento hayan sido cedidos o la fuente no contenga más elementos". cortesía Adam Houldsworth

+0

Bueno, lo asigna a una * nueva * lista en lugar de la anterior, que se marcará para GC suponiendo que esta era la única referencia a la misma. No hace nada en la misma lista aparte de repetir los primeros 4 elementos de la misma. –

+0

@ AdamHouldsworth: Gracias y corregido. –

0

probar este

List<string> lstTest = new List<string>(); 
      lstTest.Add("test1"); 
      lstTest.Add("test2"); 
      lstTest.Add("test3"); 
      lstTest.Add("test4"); 
      lstTest.Add("test5"); 
      lstTest.Add("test6");   

      lstTest.RemoveRange(4, lstTest.Count - 4); 

      foreach (string item in lstTest) 
      { 
       Console.Write(item); 
      } 
      Console.ReadLine(); 
Cuestiones relacionadas