2015-09-28 34 views
4

我有2个列表。首先是具有int属性ID的对象列表。另一个是整数列表。与int列表相比较的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循环?

+0

你能重复整数吗?你可以有相同的ID重复的汽车?在这种情况下应该做些什么? –

+0

我不会在任何一个列表中都有重复,不会。 – mameesh

+0

然后我会用一个'HashSet '来表达一个非常接近Jamiec答案的东西。 –

回答

8

一种缓慢但清晰的方法是

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

更好一个HashSet – Paparazzi

+0

@Frisbee - 谢谢,忘了那个,更新了。 – Jamiec

+0

Hashset和字典将会非常优雅.Upvoted。 –

1

你可以尝试一些简单的linq这样的事情应该工作:

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

这将花费你的汽车的列表,然后找到只有那些id包含在你的intList中的项目。