// I have a List called list
List sublist = list.GetRange(5, 5); // (gets elements 5,6,7,8,9)
List anotherSublist = list.GetRange(0, 4); // gets elements 0,1,2,3)
Czy tego szukasz?
Jeśli chcesz usunąć pozycje z listy podrzędnej z oryginalnej listy, możesz wykonać następujące czynności:
// list is our original list// sublist is our (newly created) sublist built from GetRange()foreach (Type t in sublist)
{
list.Remove(t);
}
To jest kopia segmentu oryginalnej listy, a nie widok części oryginalnej listy.
Asad Saeeduddin
@Asad Celem tej odpowiedzi było zilustrowanie, że OP może używać LINQ. Wskazałeś, że tworzy kopię. Fantastyczny. Twoje talenty prawdopodobnie mogłyby być lepiej wykorzystane przy redagowaniu tego pytania, aby zilustrować ten punkt jeszcze dokładniej niż zostawiłem to 5,5 roku temu. Jeśli go edytujesz, zdobędziesz uznanie w internetowej lidze sprawiedliwości pedanterii i będzie to dobrze zasłużone!
p.campbell
10
Ja ( podobnie jak kilka innych osób ) szukałem czegoś podobnego do subListz Javy, która eksponuje zmienny widok na oryginalną listę. To zachowuje się inaczej, co może nie być od razu oczywiste, więc pomyślałem, że warto byłoby to wskazać dla dobra każdego, kto zobaczy to później. Poza tematem, możesz chcieć zająć się jogą, medytacją lub czymś w tym rodzaju; oszalałeś bez jakiejkolwiek prowokacji.
Asad Saeeduddin
3
Użyj klauzuli Where z LINQ:
List<object> x = new List<object>();
x.Add("A");
x.Add("B");
x.Add("C");
x.Add("D");
x.Add("B");
var z = x.Where(p => p == "A");
z = x.Where(p => p == "B");
W stwierdzeniach powyżej „p” jest obiektem znajdującym się na liście. Więc jeśli użyłeś obiektu danych, tj .:
publicclassClient
{
publicstring Name { get; set; }
}
wtedy twój linq wyglądałby tak:
List<Client> x = new List<Client>();
x.Add(new Client() { Name = "A" });
x.Add(new Client() { Name = "B" });
x.Add(new Client() { Name = "C" });
x.Add(new Client() { Name = "D" });
x.Add(new Client() { Name = "B" });
var z = x.Where(p => p.Name == "A");
z = x.Where(p => p.Name == "B");
Twoja klasa kolekcji może mieć metodę, która zwraca kolekcję (podlistę) na podstawie kryteriów przekazanych w celu zdefiniowania filtru. Zbuduj nową kolekcję z pętlą foreach i rozdaj ją.
Lub użyj metody i pętli zmodyfikuj istniejącą kolekcję, ustawiając flagę (właściwość) „filtrowany” lub „aktywny”. Ten może działać, ale może również powodować problemy w kodzie wielowątkowym. Jeśli inne obiekty zależą od zawartości kolekcji, jest to dobre lub złe, w zależności od sposobu wykorzystania danych.
int[] l = {0, 1, 2, 3, 4, 5, 6};
var res = new List<int>();
res.AddRange(l.Where((n, i) => i < 2));
res.AddRange(l.Where((n, i) => i >= 2 && i <= 4).Reverse());
res.AddRange(l.Where((n, i) => i > 4));
Rangejest prawdziwe w przypadku typu danych typu integer. co, jeśli twój typ danych to DataTimei chcesz pobrać listę rekordów między dwoma określonymi datami?
Odpowiedzi:
Chcesz List :: GetRange (firstIndex, count). Zobacz http://msdn.microsoft.com/en-us/library/21k0e39c.aspx
// I have a List called list List sublist = list.GetRange(5, 5); // (gets elements 5,6,7,8,9) List anotherSublist = list.GetRange(0, 4); // gets elements 0,1,2,3)
Czy tego szukasz?
Jeśli chcesz usunąć pozycje z listy podrzędnej z oryginalnej listy, możesz wykonać następujące czynności:
// list is our original list // sublist is our (newly created) sublist built from GetRange() foreach (Type t in sublist) { list.Remove(t); }
źródło
Czy byłoby to tak proste, jak uruchomienie zapytania LINQ na Twojej liście?
List<string> mylist = new List<string>{ "hello","world","foo","bar"}; List<string> listContainingLetterO = mylist.Where(x=>x.Contains("o")).ToList();
źródło
subList
z Javy, która eksponuje zmienny widok na oryginalną listę. To zachowuje się inaczej, co może nie być od razu oczywiste, więc pomyślałem, że warto byłoby to wskazać dla dobra każdego, kto zobaczy to później. Poza tematem, możesz chcieć zająć się jogą, medytacją lub czymś w tym rodzaju; oszalałeś bez jakiejkolwiek prowokacji.Użyj klauzuli Where z LINQ:
List<object> x = new List<object>(); x.Add("A"); x.Add("B"); x.Add("C"); x.Add("D"); x.Add("B"); var z = x.Where(p => p == "A"); z = x.Where(p => p == "B");
W stwierdzeniach powyżej „p” jest obiektem znajdującym się na liście. Więc jeśli użyłeś obiektu danych, tj .:
public class Client { public string Name { get; set; } }
wtedy twój linq wyglądałby tak:
List<Client> x = new List<Client>(); x.Add(new Client() { Name = "A" }); x.Add(new Client() { Name = "B" }); x.Add(new Client() { Name = "C" }); x.Add(new Client() { Name = "D" }); x.Add(new Client() { Name = "B" }); var z = x.Where(p => p.Name == "A"); z = x.Where(p => p.Name == "B");
źródło
Z LINQ:
List<string> l = new List<string> { "1", "2", "3" ,"4","5"}; List<string> l2 = l.Skip(1).Take(2).ToList();
Jeśli potrzebujesz foreach, nie potrzebujesz ToList:
foreach (string s in l.Skip(1).Take(2)){}
Zaletą LINQ jest to, że jeśli chcesz po prostu pominąć jakiś wiodący element, możesz:
List<string> l2 = l.Skip(1).ToList(); foreach (string s in l.Skip(1)){}
tj. nie ma potrzeby dbania o liczbę / długość itp.
źródło
Twoja klasa kolekcji może mieć metodę, która zwraca kolekcję (podlistę) na podstawie kryteriów przekazanych w celu zdefiniowania filtru. Zbuduj nową kolekcję z pętlą foreach i rozdaj ją.
Lub użyj metody i pętli zmodyfikuj istniejącą kolekcję, ustawiając flagę (właściwość) „filtrowany” lub „aktywny”. Ten może działać, ale może również powodować problemy w kodzie wielowątkowym. Jeśli inne obiekty zależą od zawartości kolekcji, jest to dobre lub złe, w zależności od sposobu wykorzystania danych.
źródło
Odwróć elementy na liście podrzędnej
int[] l = {0, 1, 2, 3, 4, 5, 6}; var res = new List<int>(); res.AddRange(l.Where((n, i) => i < 2)); res.AddRange(l.Where((n, i) => i >= 2 && i <= 4).Reverse()); res.AddRange(l.Where((n, i) => i > 4));
Daje 0, 1, 4, 3, 2, 5, 6
źródło
Range
jest prawdziwe w przypadku typu danych typu integer. co, jeśli twój typ danych toDataTime
i chcesz pobrać listę rekordów między dwoma określonymi datami?