2009-07-10 4 views
0

I List<Object1> Objekt 1 enthalten 2 Felder (int id & string name)Linq wo zwischen IEnumerable und List <>

Auch habe ich IEnumerable<Object2> von linq2sql generiert gefüllt haben. Mit Feldern (id, name)

ich brauche Artikel von List<Object1> zu erhalten, die Ids in IEnumerable<Object2> fehlen. von Schlüsselfeld = id (wie, wo in SQL ..)

i verwenden Code wie

IEnumerable Object2 
List<Object1> excepted = Object2.Where(t => obj1.Contains == t.Id); 

Vielen Dank!

Antwort

5

Wie wäre:

HashSet<string> knownIds = new HashSet<string>(list2.Select(x => x.Id)); 
var exceptions = list1.Where(x => !knownIds.Contains(x.Id)); 

Wie Earwicker zu Recht sagt, wird dies nur eine geben IEnumerable<Object1> - wenn Sie eine Liste benötigen, ändern Sie die zweite Zeile:

var exceptions = list1.Where(x => !knownIds.Contains(x.Id)).ToList(); 
2

Sie können dies erreichen, indem der folgende Weg.

var excepted = objects1.Where(o1 => !objects2.Select(o2 => o2.Id).Contains(o1.Id)); 

Mit freundlichen Grüßen

+0

Ich denke es gibt einen kleinen Fehler: var ausgenommen = objects1.Where (o =>! Objects2.Select (i => i.ID) .Contains (o.ID)); –

0

Weiteren Jon Skeet Antwort, müssen Sie die ToList() Erweiterungsmethode am Ende des Ausdrucks, in eine Liste zu machen.

2

Ich bin überrascht, niemand hat beitreten vorgeschlagen:

var excepted = (from o1 in List1 
       join o2 in List2 
        on o1.Id equals o2.Id into j 
       where !j.Any() // j is empty 
       select o1 
       ).ToList(); 

Vielleicht geringfügig weniger als effizienter als HashSet Lösung Jon, aber Abfragesyntax ist Spaß.

Verwandte Themen