2010-09-30 12 views
5

Ich versuche, die verschiedenen von zwei Listen mit einer LINQ-Abfrage zu erhalten. Aber die Listen sind nicht vom selben Typ.Unterschied von zwei Liste mit verschiedenen Typen mit LINQ

List<Vehicle> unsoldVehicles 
List<string> ListDetailUrls 

Jedes Fahrzeug Objekt hat ein Feld URLID (string), während die ListDetailUrls Liste besteht nur aus Zeichenketten genannt. Ich brauche jedes Fahrzeug aus der Fahrzeugliste, wo das Feld UrlID nicht mit einem Eintrag übereinstimmt ListDetailUrls.

Was ich habe, ist bisher getan:

List<Vehicle> missingVehicles = new List<Vehicle>(
    from uV in unsoldVehicles 
    from de in ListDetailUrls 
    where uV.UrlID != de 
    select uV); 

Aber mit einer Abfrage wie folgt meine missingVehicles sind mehr Elemente als die unsoldVehicles!

Ich suchte nach einer Möglichkeit, die Except-Methode irgendwie zu verwenden, aber ich finde nur Beispiele, wo beide Listen vom selben Typ sind.

Antwort

8

Sie könnten so etwas wie dies versuchen.

var missingvehicles = from uV in unsoldVehicles 
        where !listDetailUrls.Contains(uV.UrlID) 
        select uV; 
1

Wenn ich richtig verstehe, müssen Sie alle Elemente aus der Liste unsoldVehicles mit UrlIDs, die in der ListDetailUrls Liste nicht angezeigt:

var missingVehicles = unsoldVehicles.Where(uv => !ListDetailUrls.Contains(uv.UrlID)).ToList(); 
2

Der Grund Ihre aktuelle Abfrage falsch ist, weil alle Kombinationen von (vehicle, url) wo vehicle.UrlID ! = url es am Filter vorbei machen., Während das, was Sie wirklich wollen, von einem Fahrzeug zu verhindern, wenn enthalten ist jeder URL in der Liste entspricht UrlId. Nicht nur liefert Ihre Abfrage die Fahrzeuge, die herausgefiltert werden sollen, sondern jedes Fahrzeug wird mehrmals wiederholt.

Ich schlage vor:

var urlIds = new HashSet<string>(ListDetailUrls); 
var missingVehicles = unsoldVehicles.Where(vehicle => !urlIds.Contains(vehicle.UrlID)) 
            .ToList(); 
Verwandte Themen