2010-09-30 6 views
5

J'essaie d'obtenir le différent de deux listes avec une requête LINQ. Mais les listes ne sont pas du même type.Différence de deux Liste avec différents types en utilisant LINQ

List<Vehicle> unsoldVehicles 
List<string> ListDetailUrls 

Chaque objet de véhicule a un champ appelé urlid (string) tandis que le ListDetailUrls liste ne se compose que de chaînes. J'ai besoin de tous les véhicules de la liste des véhicules où le champ UrlID ne correspond pas à une entrée ListDetailUrls.

Ce que je l'ai fait jusqu'à présent est:

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

Mais avec une requête comme ceci mes missingVehicles sont plus d'articles que les unsoldVehicles!

Je cherchais un moyen d'utiliser la méthode Except en quelque sorte, mais je ne trouve que des exemples où les deux listes sont du même type.

Répondre

8

Vous pouvez essayer quelque chose comme ça.

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

Si je comprends bien, vous avez besoin de tous les éléments de la liste unsoldVehicles avec UrlIDs qui ne figurent pas dans la liste ListDetailUrls:

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

La raison pour laquelle votre requête actuelle est incorrecte parce que toutes combinaisons de (vehicle, url)vehicle.UrlID ! = url feront passé le filtre., Alors ce que vous voulez vraiment faire est d'empêcher un véhicule d'être inclus si tout url dans la liste correspond à son UrlId. Non seulement votre requête retournera les véhicules qui doivent être filtrés, mais chaque véhicule sera répété plusieurs fois.

Je propose:

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