Czy istnieje odpowiednik .NET środowiska Java List.subList()
, który działa pod numerem IList<T>
?.NET odpowiednik List.subList języka Java()?
Odpowiedz
korzystania LINQ
list.Skip(fromRange).Take(toRange - fromRange)
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.
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!) –
OK, masz rację. Nie jestem pewien, czy to dokładny wymóg, ale zmienię odpowiedź, aby to odzwierciedlić. – Razzie
GetRange
jest odpowiedź
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()). –
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
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). –
Czy to powoduje powrót widoku do oryginalnej listy lub kopii zakresu? –
Działa na IList, nie tylko na liście, tego właśnie szukałem. – ripper234
@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