2010-09-30 21 views
5

Estoy tratando de obtener la diferente de dos listas con una consulta LINQ. Pero las listas no son del mismo tipo.Diferencia de dos listas con diferentes tipos usando LINQ

List<Vehicle> unsoldVehicles 
List<string> ListDetailUrls 

Cada Objeto El vehículo tiene un campo llamado urlid (cadena), mientras que el ListDetailUrls lista se compone sólo de cuerdas. Necesito todos los vehículos de la lista de vehículos donde el campo UrlID no coincide con una entrada ListDetailUrls.

Lo que he hecho hasta ahora es:

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

Pero con una consulta como esta mi missingVehicles son más elementos que los unsoldVehicles!

Estaba buscando una forma de usar el método Excepto de alguna manera, pero solo encuentro ejemplos donde ambas listas son del mismo tipo.

Respuesta

8

usted podría intentar algo como esto.

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

Si he entendido bien, es necesario todos los elementos de la lista unsoldVehicles con UrlIDs que no aparecen en la lista ListDetailUrls:

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

La razón de su consulta actual es incorrecta se debe a todos combinaciones de (vehicle, url) donde vehicle.UrlID ! = url se hace más allá del filtro., Mientras que lo que realmente quiere hacer es evitar que un vehículo de ser incluido si cualquier url en la lista coincide con UrlId. Su consulta no solo devolverá los vehículos que se deben filtrar, sino que cada vehículo se repetirá varias veces.

sugiero:

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