2010-08-06 12 views

Respuesta

28
var itemsOneThroughTwenty = myList.Take(20); 
var itemsFiveThroughTwenty = myList.Skip(5).Take(15); 
+6

Tenga en cuenta que estas extensiones Linq realmente crean un IEnumerable <> que se detiene después de N elementos, en lugar de crear una nueva matriz/lista. (Esto está algo oculto al usar 'var' para el tipo de variable. Si el código que sigue al truncamiento itera varias veces a través de la nueva lista, en realidad volverá a evaluar el árbol de expresiones * cada vez *. En este caso , es posible que desee insertar un '.ToList()' al final para forzar que se enumeren los elementos y se cree una nueva lista. – JaredReisinger

19

Puede utilizar List<T>.GetRange():

var subList = myList.GetRange(0, 20); 

De MSDN:

Crea una copia superficial de una serie de elementos en la fuente List<T>.

public List<T> GetRange(int index, int count)

2

sans LINQ QUICKY ...

while (myList.Count>countIWant) 
     myList.RemoveAt(myList.Count-1); 
0
public static IEnumerable<TSource> MaxOf<TSource>(this IEnumerable<TSource> source, int maxItems) 
    { 
     var enumerator = source.GetEnumerator();    
     for (int count = 0; count <= maxItems && enumerator.MoveNext(); count++) 
     { 
      yield return enumerator.Current; 
     } 
    } 
+0

Tal como está, podría considerar agregar algún texto explicativo, ya que los usuarios menos experimentados podrían tener dificultades para comprender su responder. – Raad

3

Esto podría ser útil para la eficiencia, si realmente desea truncar la lista, no hacer una copia. Mientras que el ejemplo de Python hace una copia, la pregunta original realmente era sobre truncar la lista.

dado una lista <> objeto "lista" y desea que el primero a través de elementos 20

list.RemoveRange(20, list.Count-20); 

Esto lo hace en su lugar. Esto sigue siendo O (n) ya que las referencias a cada objeto deben eliminarse, pero debe ser un poco más rápido que cualquier otro método.

Cuestiones relacionadas