2011-10-25 8 views
5

Con un elenco generico, qual è il modo più rapido per verificare se esiste un elemento con una determinata condizione e, se esiste, selezionarlo, senza effettuare una doppia ricerca nell'elenco:Verifica dell'elemento nell'elenco generico prima di utilizzarlo

Per esempio:

if (list.Exists(item => item == ...)) 
{ 
    item = list.Find(item => item == ...) 
    .... 
} 
+0

Basta fare la ricerca. – dlev

+1

e se item! = Null sei d'oro –

risposta

5

O utilizzare Find una volta e confrontare il risultato con default(T), o se default(T) potrebbe essere l'elemento stesso, utilizzare FindIndex e controllare se il indice è -1:

int index = list.FindIndex(x => x...); 
if (index != -1) 
{ 
    var item = list[index]; 
    // ... 
} 

Se si sta utilizzando .NET 3.5 o superiore, è più idiomatico per usare LINQ - ancora una volta, se default(T) non è un problema, si potrebbe usare qualcosa come:

var item = list.FirstOrDefault(x => x....); 
if (item != null) 
{ 
    ... 
} 

L'utilizzo di LINQ consente di modificare da List<T> altre raccolte in seguito senza modificare il codice.

3

si può fare semplicemente con LINQ, è sufficiente aggiungere utilizzando System.Linq nella parte superiore dello spazio dei nomi;

In primo luogo, se si desidera ottenere tutti i risultati:

var items = list.Where(item=>item.Id == giveID).ToList(); 

o se si desidera solo primo risultato;

var result = list.FirstOrDefault(item=>item.ID == givenID); 

invece di item.Id == givenID è possibile inserire i propri criteri. ad esempio, se l'articolo è stringa si può fare item == "Test" o se è int fare item == 5, ...

+0

Non farei '.ToList()' di default. Questo ti offre la possibilità di ottenere profitti dalle prestazioni. '.ToList()' ti dà una lista degli elementi trovati, mentre senza di essa otterrai un IEnumerator per iterare attraverso gli elementi. – Fischermaen

+0

@Fischermaen Non lo farei, ma poiché vedo che OP non ha familiarità con linq e l'esecuzione defferita causa ambiguità, suggerisco questo, Finalmente dovresti eseguire un albero di espressioni preparato, quindi senza scrivere per elencare, rende solo query e non ti ha ottenuto alcun oggetto IEnumerable (non fare errori con quello che vedi in fase di compilazione). Puoi eseguirlo ogni volta che vuoi, ma dovresti farlo se lo vuoi. può essere fatto dal ciclo foreach o da tutto il resto –

5
item = list.Find(item => item == ...); 
if(null != item) 
{ 
    //do whatever you want 
} 
+1

Si noti che questo non funziona se 'null' è un valore valido che si sta cercando. Inoltre non funziona per 'Lista ' ecc. Si noti inoltre che non è necessario utilizzare l'approccio "costante prima" nelle condizioni in C#, ad eccezione delle situazioni in cui si sta verificando esplicitamente l'uguaglianza con i valori di 'bool'. –

+0

Sì e grazie, hai ragione. Ma non capisco il tuo secondo punto, che differenza fa null! = Item and item! = Null fa? –

Problemi correlati