2010-09-30 20 views
5

Próbuję uzyskać różne z dwóch list za pomocą kwerendy LINQ. Ale listy nie są tego samego typu.Różnica dwóch list różnych typów przy użyciu LINQ

List<Vehicle> unsoldVehicles 
List<string> ListDetailUrls 

Każdy obiekt Pojazd ma pole o nazwie UrlID (string), podczas gdy ListDetailUrls lista składa się tylko z łańcuchów. Potrzebuję każdego pojazdu z listy pojazdów, w którym pole UrlID nie pasuje do wpisu ListDetailUrls.

co zrobiłem do tej pory:

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

Ale z zapytaniem jak ten mój missingVehicles więcej pozycji niż unsoldVehicles!

Szukałem sposobu użycia metody Except, ale znajduję tylko próbki, w których obie listy są tego samego typu.

Odpowiedz

8

można spróbować coś takiego.

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

Jeśli dobrze rozumiem, trzeba wszystkie elementy z listy unsoldVehicles z UrlIDs, które nie pojawiają się na liście ListDetailUrls:

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

Powodem aktualna zapytanie jest niepoprawne dlatego wszystkie kombinacje (vehicle, url) gdzie vehicle.UrlID ! = url uczynią go obok filtra., Mając na uwadze to, co naprawdę chcę robić to, aby zapobiec pojazdu z wchodzących jeśli dowolnym adres URL na liście odpowiada UrlId. Nie tylko zapytanie zwróci pojazdy, które powinny zostać odfiltrowane, ale każdy pojazd zostanie powtórzony wiele razy.

Proponuję:

var urlIds = new HashSet<string>(ListDetailUrls); 
var missingVehicles = unsoldVehicles.Where(vehicle => !urlIds.Contains(vehicle.UrlID)) 
            .ToList(); 
Powiązane problemy