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; 

Hier sind zwei IEnumerable.check existense zwischen zwei IEnumerable

Ich möchte überprüfen, ob eine value in existedThings in thingsToSave existieren.

O.K. Ich kann das mit 3 Zeilen Code machen.

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

Aber es sieht schmutzig aus.

Ich möchte nur wissen, ob es eine bessere Lösung gibt.

+0

Sorry über mein schlechtes Englisch! –

+2

Mach dir keine Sorgen, ich habe weit schlimmeres gesehen als vermeintliche englische Muttersprachler. Du machst das gut! –

Antwort

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

Suchen Sie nach der Enumerable.Intersect Method

+6

Verwenden Sie .Any() anstelle von .Count()> 0, um unnötige Iterationen zu vermeiden. –

+0

Danke dafür! – VMAtm

4

Sie können Intersect verwenden diese zu erreichen:

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

Sie können sogar Ihre eigenen Vergleich liefern, wenn Sie benötigen: Enumerable.Intersect

3

Es ist schmutzig und es wird auch nicht funktionieren! Ihr hasItemNo wäre nur true, wenn der letzte Wert in existedThings in thingsToSave war.

Da Sie dies mit „Linq“ markiert, obwohl ich diesen Code bin zu raten, wird für Sie arbeiten:

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

Guter Fang bei der booleschen Zuweisung! +1 – Lazarus

2

nicht absolut klar, was Sie wirklich hier wollen, aber hier ist ein Vorschlag nur die für das Abrufen Zeichenketten, die in thingstoSave und existenThings existieren.

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

Die upvoted Antworten schlagen einen Algorithmus, O (n^2) Komplexität haben wird, wenn die IEnumerable nicht aus einer Klasse abgeleitet wurde, die ICollection implementiert <>. Eine Linq-Abfrage zum Beispiel. Die Count() - Erweiterungsmethode muss dann alle Elemente durchlaufen, um sie zu zählen. Das ist nicht cool. Sie müssen nur prüfen, ob das Ergebnis enthält alle Elemente:

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

Die Reihenfolge Angelegenheiten btw, machen die Aufzählung, die Sie mit der kleinsten Anzahl von Elementen das Argument von Intersect zu erwarten haben().

+0

+1 für die Reihenfolge, in der Sie die Sammlungen verwenden. – rsgoheen

Verwandte Themen