2010-06-10 16 views
5
IEnumerable<String> existedThings = 
     from mdinfo in mdInfoTotal select mdinfo.ItemNo; 

IEnumerable<String> thingsToSave = 
     from item in lbXReadSuccess.Items.Cast<ListItem>() select item.Value; 

Qui ci sono due IEnumerable.verifica esistenza tra due elementi IEnumerable

Desidero verificare se uno value in existedThings esiste in thingsToSave.

O.K. Posso farlo con 3 codice di linea.

bool hasItemNo; 
foreach(string itemNo in existedThings) 
    hasItemNo= thingsToSave.Contains(itemNo); 

Ma, sembra sporco.

Voglio solo sapere se c'è una soluzione migliore.

+0

Mi dispiace per il mio povero inglese! –

+2

Non ti preoccupare, ho visto di gran lunga peggio di presunti madrelingua inglesi. Stai facendo bene! –

risposta

8
int[] id1 = { 44, 26, 92, 30, 71, 38 }; 
int[] id2 = { 39, 59, 83, 47, 26, 4, 30 }; 

IEnumerable<int> both = id1.Intersect(id2); 

foreach (int id in both) 
    Console.WriteLine(id); 

//Console.WriteLine((both.Count() > 0).ToString()); 
Console.WriteLine(both.Any().ToString()); 

Cercare il Enumerable.Intersect Method

+6

Utilizzare .Any() anziché .Count()> 0 per evitare l'iterazione non necessaria. –

+0

Grazie per quello! – VMAtm

4

È possibile utilizzare Intersect per raggiungere questo obiettivo:

// puts all items that exists in both lists into the inBoth sequence 
IEnumerable<string> inBoth = existedThings.Intersect(thingsToSave); 
4
bool hasItemNo = existedThings.Intersect(thingsToSave).Count() > 0; 

È anche possibile fornire il proprio operatore di confronto se è necessario: Enumerable.Intersect

3

È sporco e non funziona! Il numero hasItemNo sarà solo true se l'ultimo valore in existedThings è thingsToSave.

Dal momento che hai contrassegnato questo con "Linq", però, sto cercando di indovinare il codice funzionerà per voi:

bool hasItemNo = thingsToSave.Intersect(existedThings).Count() > 0 
+0

Buona presa sul compito booleano! +1 – Lazarus

2

non è assolutamente chiaro su ciò che si vuole veramente qui, ma qui è un suggerimento per solo il recupero stringhe che esistono nelle cose per salvare ed esistere.

IEnumerable<String> existedThings = 
     from mdinfo in mdInfoTotal select mdinfo.ItemNo; 

IEnumerable<String> thingsToSave = 
     from item in lbXReadSuccess.Items.Cast<ListItem>() 
     where existedThings.Contains(item.Value) 
     select item.Value; 
8

Le risposte upvoted propongono un algoritmo che avrà O (n^2) se la complessità IEnumerable non derivava da una classe che implementa ICollection <>. Una query Linq per esempio. Il metodo di estensione Count() deve quindi iterare tutti gli elementi per contarli. Questo non e buono. Hai solo bisogno di controllare se il risultato contiene eventuali elementi:

bool hasItemNo = existedThings.Intersect(thingsToSave).Any(); 

L'ordine questioni proposito, fare l'enumerazione che si aspetta di avere il minor numero di elementi l'argomento del Intersect().

+0

+1 per indicare l'ordine in cui si utilizzano le raccolte. – rsgoheen

Problemi correlati