使用LINQ的两个具有不同类型的List的差异

时间:2010-09-30 11:54:46

标签: linq

我正在尝试使用LINQ查询获取两个不同的列表。但列表的类型不同。

List<Vehicle> unsoldVehicles
List<string> ListDetailUrls

每个Vehicle Object都有一个名为 UrlID (字符串)的字段,而 ListDetailUrls 列表只包含字符串。 我需要车辆列表中的每辆车,其中 UrlID 字段与条目 ListDetailUrls 不匹配。

到目前为止,我所做的是:

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

但是通过这样的查询我的 missingVehicles unsoldVehicles 更多的项目!

我正在寻找一种方法以某种方式使用Except方法,但我只找到两个列表属于同一类型的样本。

3 个答案:

答案 0 :(得分:8)

你可以尝试这样的事情。

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

答案 1 :(得分:2)

您当前查询不正确的原因是因为(vehicle, url)的{​​strong>所有组合,其中vehicle.UrlID ! = url将使其超过过滤器。而您真正想要做的是如果列表中的任何网址与其UrlId匹配,则会阻止包含此广告。 您的查询不仅会返回应该过滤掉的车辆,而且每辆车都会重复多次。

我建议:

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

答案 2 :(得分:1)

如果我理解正确,您需要unsoldVehicles列表UrlIDsListDetailUrls列表中未显示的所有项目:

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