2009-08-17 27 views

Odpowiedz

10

korzystania LINQ

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

Czy to powoduje powrót widoku do oryginalnej listy lub kopii zakresu? –

+0

Działa na IList, nie tylko na liście, tego właśnie szukałem. – ripper234

+1

@Joachim Sauer: To zapytanie, a jego wynik zależy od tego, jak jest oceniany. Podczas oceniania pętle przechodzą przez elementy listy stosujące pewną regułę. To nie jest prosty analog dla funkcji podlisty Java i błędem jest porównywanie ich w tym przypadku. – Kamarey

9

Dla standardowego List<T> jest to metoda GetRange(int, int).

Edytuj: zauważ, że jest to płytka kopia, a nie "widok" na oryginale. Nie sądzę, że C# oferuje taką właśnie funkcjonalność.

Edit2: jak Kamarey zwraca uwagę, można mieć tylko do odczytu Zobacz:

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 

Powyższy będzie drukować 7, 42, 9.

+2

Z dokumentacji MSDN (http://msdn.microsoft.com/en-us/library/21k0e39c.aspx) wynika, że nie wydaje się być takie samo: GetRange() zwraca płytką kopię, podczas gdy subList() zwraca widok (np. zmiany w pod-liście() zostaną odzwierciedlone na oryginalnej liście!) –

+0

OK, masz rację. Nie jestem pewien, czy to dokładny wymóg, ale zmienię odpowiedź, aby to odzwierciedlić. – Razzie

1

GetRange jest odpowiedź

+3

Znowu: nie jest to * dokładnie * to samo, ponieważ zwraca płytką kopię zamiast widoku. Zwrócenie widoku umożliwia wykonanie całkiem niezłych sztuczek (na przykład niepotrzebne jest stosowanie metody RemoveRange(), ponieważ można ją łatwo zapisać jako list.subList (x, y) .clear()). –

+0

Muszę szczerze powiedzieć, że tak naprawdę nie widzę korzyści. Również removeRange() i subList.clear() nie brzmi tak samo, ponieważ usuwanie nie powinno być takie samo jak usuwanie zakresu. Ale no cóż :-) – Razzie

+5

Gdy tylko zgadniesz, że subList() zwraca widok na oryginalną listę (a nie kopię), stanie się jasne, że someList.subList (1,3) .clear() będzie usuń obiekty z oryginalnej listy. A najważniejsza część nie jest, jeśli jest lepsza lub nie, ale te subList() i GetRange() nie robią tego samego, więc nie powinny być prezentowane jako równoważne (przynajmniej nie bez zastrzeżenia). –