2009-08-17 7 views

Antwort

10

mit LINQ

list.Skip(fromRange).Take(toRange - fromRange) 
+2

Gibt dies eine Ansicht in die ursprüngliche Liste oder eine Kopie des Bereichs zurück? –

+0

Funktioniert auf IList, nicht nur auf der Liste, das ist, was ich gesucht habe. – ripper234

+1

@Joachim Sauer: Dies ist eine Abfrage und das Ergebnis hängt davon ab, wie es ausgewertet wird. Während der Auswertung durchläuft es Listenelemente, die eine Regel anwenden. Dies ist nicht gerade analog für die SubList-Funktion von Java, und es ist ein Fehler, sie in diesem Fall zu vergleichen. – Kamarey

9

Für das generische List<T> ist es die GetRange(int, int) Methode.

Edit: Beachten Sie, dass dies eine flache Kopie ist, nicht eine "Ansicht" auf das Original. Ich denke nicht, dass C# genau diese Funktionalität bietet.

Edit2: als Kamarey weist darauf hin, können Sie eine schreibgeschützte Ansicht haben:

List<int> integers = new List<int>() { 5, 6, 7, 8, 9, 10, 11, 12 }; 
IEnumerable<int> view = integers.Skip(2).Take(3); 
integers[3] = 42; 

foreach (int i in view) 
    // output 

Das obige 7 drucken, 42, 9.

+2

Von der MSDN-Dokumentation (http://msdn.microsoft.com/en-us/library/21k0e39c.aspx) es tun Es scheint nicht dasselbe zu sein: GetRange() gibt eine flache Kopie zurück, während subList() eine Ansicht zurückgibt (d. h. Änderungen an der UnterListe() werden in der ursprünglichen Liste reflektiert!) –

+0

ok du hast Recht. Nicht sicher, ob dies die genaue Anforderung ist, aber ich werde meine Antwort bearbeiten, um das zu reflektieren. – Razzie

1

GetRange ist Ihre Antwort

+3

Nochmal: Es ist nicht * genau * dasselbe, da es eine flache Kopie anstelle einer Ansicht zurückgibt. Das Zurückgeben einer Ansicht ermöglicht einige ziemlich raffinierte Tricks (es macht es beispielsweise unnötig, eine RemoveRange() -Methode bereitzustellen, da sie leicht als listList (x, y) .clear()) geschrieben werden kann. –

+0

Ich muss ehrlich sagen, dass ich nicht wirklich die Vorteile sehe. Außerdem klingen removeRange() und subList.clear() nicht gleich, da das Löschen nicht dem Entfernen eines Bereichs entspricht. Aber gut :-) – Razzie

+5

Sobald Sie das Konzept, dass subList() eine Sicht in die ursprüngliche Liste (und keine Kopie) zurückgibt, wird es offensichtlich, dass someList.subList (1,3) .clear() wird Entfernen Sie Objekte aus der ursprünglichen Liste. Und der wichtigste Teil ist nicht, ob es besser ist oder nicht, aber dass subList() und GetRange() nicht dasselbe tun, also sollten sie nicht als äquivalent präsentiert werden (zumindest nicht ohne einen Disclaimer). –