2010-09-30 21 views
5

Sto cercando di ottenere il diverso da due elenchi con una query LINQ. Ma gli elenchi non sono dello stesso tipo.Differenza di due elenchi con tipi diversi utilizzando LINQ

List<Vehicle> unsoldVehicles 
List<string> ListDetailUrls 

Ogni oggetto veicolo ha un campo chiamato UrlID (stringa), mentre il ListDetailUrls elenco è composto solo di stringhe. Ho bisogno di ogni veicolo dall'elenco dei veicoli in cui il campo UrlID non corrisponde a una voce ListDetailUrls.

Quello che ho fatto finora è:

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

Ma con una query come questo mio missingVehicles sono più elementi rispetto ai unsoldVehicles!

ero alla ricerca di un modo per utilizzare il metodo Tranne in qualche modo ma trovo solo campioni in cui entrambe le liste sono dello stesso tipo.

risposta

8

si potrebbe provare qualcosa di simile.

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

Se ho capito bene, avete bisogno di tutte le voci dall'elenco unsoldVehicles con UrlIDs che non compaiono nella lista ListDetailUrls:

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

La ragione per la query corrente è errata perché tutti combinazioni di (vehicle, url) dove vehicle.UrlID ! = url renderà passato il filtro., Mentre ciò che si vuole veramente fare è quello di evitare che un veicolo venga incluso se qualsiasi L'URL nell'elenco corrisponde a UrlId. La query non solo restituirà i veicoli che dovrebbero essere filtrati, ma ogni veicolo verrà ripetuto più volte.

suggerisco:

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