2010-08-06 17 views

Antwort

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

Beachten Sie, dass diese LINQ-Erweiterungen tatsächlich ein IEnumerable <> erstellen, das nach N Elementen anhält, anstatt ein neues Array/eine neue Liste zu erstellen. (Dies wird durch die Verwendung von 'var' für den Variablentyp verdeckt. Wenn der Code nach der Trunkierung viele Male durch die neue Liste iteriert, wird der Ausdrucksbaum * jedes Mal * neu bewertet. In diesem Fall Vielleicht möchten Sie eine '.ToList()' an das Ende heften, um zu erzwingen, dass die Elemente aufgelistet werden und eine neue Liste erstellt wird – JaredReisinger

19

können Sie List<T>.GetRange() verwenden:

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

Von MSDN:

Erstellt eine flache Kopie eines Bereichs von Elementen in der Quelle 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

Wie es aussieht, könnten Sie einen erläuternden Text hinzufügen, da weniger erfahrene Benutzer Schwierigkeiten haben werden, Ihr zu verstehen Antworten. – Raad

3

Dies könnte für Effizienz hilfreich sein, wenn Sie wirklich die Liste kürzen wollen, nicht eine Kopie. Während das Python-Beispiel eine Kopie erstellt, ging es bei der ursprünglichen Frage wirklich darum, die Liste zu kürzen.

eine Liste <> Objekt „Liste“ Gegeben und Sie die 1. bis 20. Elemente

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

Dies tut es an seinem Platz. Dies ist immer noch O (n), da die Verweise auf jedes Objekt entfernt werden müssen, aber etwas schneller sein sollten als bei jeder anderen Methode.

Verwandte Themen