具有 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<int>
提出与 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<int>
。此处无法推断类型。【参考方案2】:
您可以尝试一些简单的linq
,这样应该可以:
var matched = cars.Where(w => intList.Contains(w.id)).ToList();
这将获取您的汽车列表,然后仅查找 id 包含在您的 intList 中的那些项目。
【讨论】:
以上是关于具有 int 属性的对象列表与 Int 列表相比的主要内容,如果未能解决你的问题,请参考以下文章
为啥我从 Dapper 返回的对象具有 null 和默认属性值?
如何对集合中所有对象的属性执行.Max()并返回具有最大值的对象[重复]