具有 int 属性的对象列表与 Int 列表相比

Posted

技术标签:

【中文标题】具有 int 属性的对象列表与 Int 列表相比【英文标题】:List of Objects with int property compared to List of Int 【发布时间】:2015-12-25 22:56:08 【问题描述】:

我有 2 个列表。首先是具有 int 属性 ID 的对象列表。另一个是整数列表。

我需要比较这两个列表并将对象复制到一个新列表中,其中仅包含基于 ID 在两个列表之间匹配的对象。现在我正在使用 2 个 foreach 循环,如下所示:

var matched = new list<Cars>();
foreach(var car in cars)
foreach(var i in intList)

 if (car.id == i) 
  matched.Add(car);

这似乎会很慢,因为它会多次迭代每个列表。有没有办法在不使用这样的 2 个 foreach 循环的情况下做到这一点?

【问题讨论】:

你能有重复的整数吗?你能有相同ID的重复汽车吗?遇到这种情况应该怎么办? 我永远不会在任何一个列表中出现重复项,不会。 那么我会建议使用HashSet&lt;int&gt; 提出与 Jamiec 的答案非常接近的内容。 【参考方案1】:

一种缓慢但清晰的方法是

var matched = cars.Where(car => intList.Contains(car.id)).ToList();

您可以通过将intList 转换为字典并改用ContainsKey 来加快此过程。

var intLookup = intList.ToDictionary(k => k);
var matched = cars.Where(car => intLookup.ContainsKey(car.id)).ToList();

更好的是,HashSet

var intHash = new HashSet(intList);
var matched = cars.Where(car => intHash.Contains(car.id)).ToList();

【讨论】:

更好的是一个 HashSet 哈希集和字典会很优雅。赞成。 矩形:HashSet&lt;int&gt;。此处无法推断类型。【参考方案2】:

您可以尝试一些简单的linq,这样应该可以:

var matched = cars.Where(w => intList.Contains(w.id)).ToList(); 

这将获取您的汽车列表,然后仅查找 id 包含在您的 intList 中的那些项目。

【讨论】:

以上是关于具有 int 属性的对象列表与 Int 列表相比的主要内容,如果未能解决你的问题,请参考以下文章

使用公共属性联合两个不同类型的列表[重复]

为啥我从 Dapper 返回的对象具有 null 和默认属性值?

Haskell int 列表到字符串

如何对集合中所有对象的属性执行.Max()并返回具有最大值的对象[重复]

查找一个列表中具有与另一个对象列表中的属性匹配的属性的所有对象

产生具有“int”结构的列表的语句?