2015-09-28 69 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中的項目。