2010-06-10 4 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; 

Voici deux IEnumerable. Je veux vérifier si value in existedThings existe dans thingsToSave.vérifier existense entre deux IEnumerable

O.K. Je peux le faire avec 3 lignes de code.

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

Mais, il semble sale. Je veux juste savoir s'il y a une meilleure solution.

+0

Désolé pour mon pauvre anglais! –

+2

Ne vous inquiétez pas à ce sujet, j'ai vu bien pire de présumés anglophones. Tu t'en sors bien! –

Répondre

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

Recherchez le Enumerable.Intersect Method

+6

Utilisez .Any() au lieu de .Count()> 0 pour éviter les itérations inutiles. –

+0

Merci pour ça! – VMAtm

4

Vous pouvez utiliser Intersect pour y parvenir:

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

Vous pouvez même fournir votre propre comparateur si vous devez: Enumerable.Intersect

3

C'est sale et ça ne marchera pas non plus! Votre hasItemNo ne serait que true si la dernière valeur dans existedThings était dans thingsToSave.

Depuis vous avez marqué avec « Linq », bien que, je devine que ce code fonctionne pour vous:

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

Bonne prise sur l'affectation booléenne! +1 – Lazarus

2

Pas tout à fait clair sur ce que vous voulez vraiment ici, mais voici une suggestion pour récupérer uniquement la les chaînes qui existent dans le thingstoSave et existsThings.

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

Les réponses upvoted proposent un algorithme qui aura O (n^2) si la complexité IEnumerable n'a pas été dérivé d'une classe qui implémente ICollection <>. Une requête Linq par exemple. La méthode d'extension Count() doit ensuite itérer tous les éléments pour les compter. Ce n'est pas cool. Il vous suffit de vérifier si le résultat contient des éléments:

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

Les questions pour btw, faire l'énumération que vous attendez d'avoir le plus petit nombre d'éléments l'argument de Intersection().

+0

+1 pour indiquer l'ordre dans lequel vous utilisez les collections. – rsgoheen

Questions connexes