具有int属性的对象列表与Int的列表进行比较

mam*_*esh 4 .net c# list

我有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);
}
Run Code Online (Sandbox Code Playgroud)

这看起来很慢,因为它多次迭代每个列表.有没有办法这样做而不使用像这样的2个foreach循环?

Jam*_*iec 8

一种缓慢但清晰的方式

var matched = cars.Where(car => intList.Contains(car.id)).ToList();
Run Code Online (Sandbox Code Playgroud)

您可以通过将字母intList转换为字典并使用ContainsKey而更快地完成此操作.

var intLookup = intList.ToDictionary(k => k);
var matched = cars.Where(car => intLookup.ContainsKey(car.id)).ToList();
Run Code Online (Sandbox Code Playgroud)

更好的是,a HashSet:

var intHash = new HashSet(intList);
var matched = cars.Where(car => intHash.Contains(car.id)).ToList();
Run Code Online (Sandbox Code Playgroud)

  • 更好的是哈希集 (5认同)