2013-03-23 21 views
8

C'è un modo conveniente per rimuovere un elenco annidato da un altro elenco se soddisfa determinati requisiti? Ad esempio, diciamo che abbiamo una serie di fermate e decidiamo di chiamare ogni raccolta di fermate su una rotta. Ogni percorso è in elenco da. Quindi decidiamo di inserire ogni rotta in una lista.C# Rimozione di un elenco da un elenco

Così ora che abbiamo un elenco di percorsi, qualcuno decide che alcuni tipi di percorsi in realtà non dovrebbero essere inclusi nella lista rotte. Come posso rimuovere quelle rotte? Ecco alcuni esempi di codice:

Esempio Classe

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

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

Creare le liste

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); 

Come posso rimuovere qualsiasi percorso da lstRoutes che ha, ad esempio, qualsiasi valore param1 maggiore di 6?

risposta

7

più semplice modo (che può essere applicabile a tutti i enumerables, non elenca solo):

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

Questo crea una nuova lista in modo si verificherà una copia. Il modo più efficiente sarebbe "non aggiungere" quegli elementi all'elenco in primo luogo. Il secondo più efficiente sarebbe Rimozione di elementi dalla lista stessa invece di costruire una nuova:

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

Ah vorrei poter evitare di aggiungerli alla lista nel primo passo. Sfortunatamente, la lista di partenza è un mucchio di permutazioni e ho il compito di eliminare le permutazioni che non hanno senso. Il primo bit di codice che hai postato ha generato il seguente errore: Impossibile convertire l'espressione lambda in type perché non è un tipo delegato. MA il secondo bit ha funzionato alla grande. Grazie mille! –

+0

sai come posso ottenere l'indice di param1? So che in questo caso sarà sempre 0, ma ogni percorso è composto da un gruppo di numeri interi, e volevo rimuovere tutti i percorsi in cui 6 si verificavano prima delle 7. In caso contrario, nessun grosso problema. Lo capirò o inizierò un'altra domanda. –

+0

capito. Grazie ancora per il vostro aiuto. –

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

Grazie mille per la risposta, ma non riuscivo a farlo funzionare. Ho ricevuto il seguente errore: 'System.Collections.Generic.List ' non contiene una definizione per 'param1' e non è stato trovato alcun metodo di estensione 'param1' che accetta un primo argomento di tipo 'Stops'. –

Problemi correlati