Jak uzyskać podlistę w C #

89

Mam List<String>i muszę usunąć podlistę z tej listy. Czy są dostępne do tego metody listy w .NET 3.5?

Thomas Manalil
źródło
Czy możesz pokazać nam próbkę kodu tego, co masz, lub wyjaśnić? Nie podążam za pytaniem.
David
Mam listę powiedz List <String> list = new list <String> (); muszę usunąć podlistę z tej listy, powiedzmy od indeksu 2 do długości-1 ..
Thomas Manalil

Odpowiedzi:

129

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);
}
Josh
źródło
4
Nie możesz usuwać elementów z listy podczas iteracji po nich za pomocą foreach .....!
slugster
Slugster; Iteruję po liście „b” podczas usuwania z listy „a”. To legalne :)
Josh
6

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();
p.campbell
źródło
1
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 .:

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");
slugster
źródło
Po opracowaniu użyj mojego pierwszego przykładu i dodaj to: z = x.GetRange (1, 3); x.RemoveRange (1, 3); x.AddRange (z.OrderByDescending (p => p));
slugster
2

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.

jw_
źródło
0

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.

Doug L.
źródło
0

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

Phillip Ngan
źródło
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?
Jogi