2013-03-23 30 views
8

Czy istnieje wygodny sposób na usunięcie zagnieżdżonej listy z innej listy, jeśli spełnia ona określone wymagania? Na przykład, powiedzmy, że mamy kolekcję przystanków, a my decydujemy się na wywołanie każdego zbioru przystanków trasy. Każda trasa jest na liście z. Następnie decydujemy się umieścić każdą trasę w liście.C# Usuwanie listy z listy

Teraz, gdy mamy listę tras, ktoś decyduje, że niektóre typy tras naprawdę nie powinny być uwzględnione na liście tras. Jak mogę usunąć te trasy? Oto niektóre przykładowy kod:

Przykład Klasa

public class Stops 
{ 
    public Stops(int _param1, string _param2) 
    { 
     param1 = _param1; 
     param2 = _param2; 
    } 

    public int param1 { get; set; } 
    public string param2 { get; set; } 
} 

Tworzenie wykazów

List<List<Stops>> lstRoutes = new List<List<Stops>>(); 
List<Stops> lstStops = new List<Stops>(); 
List<Stops> lstMoreStops = new List<Stops>(); 

// Create some stops 
for (int i = 0; i < 5; i++) 
{ 
    lstStops.Add(new Stops(i, "some text")); 
} 

lstRoutes.Add(lstStops); 

// Create some more stops 
for (int i = 5; i < 10; i++) 
{ 
    lstMoreStops.Add(new Stops(i, "some more text")); 
} 

lstRoutes.Add(lstMoreStops); 

Jak mogę usunąć trasę z lstRoutes który ma, powiedzmy, żadnej wartości Param1 większą niż 6?

Odpowiedz

7

Najprostszy sposób (które mogą być stosowane do wszystkich enumerables, nie tylko wymienia):

lstRoutes = lstRoutes.Where(r => !r.Any(s => s.param1 > 6)).ToList(); 

Tworzy nową listę więc nastąpić kopiowanie. Najskuteczniejszym sposobem byłoby "nie dodawanie" tych pozycji do listy w pierwszej kolejności. Drugim najbardziej efektywne byłoby usunięcie pozycji z listy zamiast samego konstruowania nowego:

lstRoutes.RemoveAll(r => r.Any(s => s.param1 > 6)); 
+0

Ha Chciałabym uniknąć dodawania ich do listy w pierwszym tempie. Niestety, lista startowa to garść permutacji i mam za zadanie pozbyć się permutacji, które nie mają sensu. Pierwszy napisany kod rzucił następujący błąd: Nie można przekonwertować wyrażenia lambda na typ, ponieważ nie jest to typ delegata. ALE drugi kawałek działał świetnie. Dziękuję Ci bardzo! –

+0

czy wiesz, jak mogę uzyskać indeks param1? Wiem, że w tym przypadku zawsze będzie 0, ale powiedz, że każda trasa składa się z wielu liczb całkowitych, i chciałem usunąć wszystkie trasy, gdzie 6 miało miejsce przed 7. Jeśli nie, to nic wielkiego. Zrobię to albo zacznę kolejne pytanie. –

+0

to wymyśliłem. Jeszcze raz dziękuję za pomoc. –

0
List<Stops> stop = lstRoutes.Find(delegate(List<Stops> stp) { return stp.param1 > 6; }); 
+0

Wielkie dzięki za odpowiedź, ale nie mogłem tego zmusić do działania. Otrzymałem następujący błąd: "System.Collections.Generic.List " nie zawiera definicji "param1" i nie ma metody rozszerzenia "param1", można znaleźć akceptację pierwszego argumentu typu "Stops". –