将具有int属性的对象列表与int类型的列表进行比较

本文关键字:列表 int 比较 类型 对象 属性 | 更新日期: 2023-09-27 18:14:48

我有两个列表。第一个是具有int属性ID的对象列表。另一个是int类型的列表。

我需要比较这两个列表,并将对象复制到一个新的列表中,只有基于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循环?

将具有int属性的对象列表与int类型的列表进行比较

一个缓慢但清晰的方法是

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();

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

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

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