2016-08-19 86 views
-1

我有以下列表。比較兩個不同對象的列表

與Person對象的一個​​列表有ID &名稱屬性。其他與People對象的列表有ID,名稱& Address屬性。

List<Person> p1 = new List<Person>(); 
p1.Add(new Person() { Id = 1, Name = "a" }); 
p1.Add(new Person() { Id = 2, Name = "b" }); 
p1.Add(new Person() { Id = 3, Name = "c" }); 
p1.Add(new Person() { Id = 4, Name = "d" }); 

List<People> p2 = new List<People>(); 
p2.Add(new People() { Id = 1, Name = "a", Address=100 }); 
p2.Add(new People() { Id = 3, Name = "x", Address=101 }); 
p2.Add(new People() { Id = 4, Name = "y", Address=102 }); 
p2.Add(new People() { Id = 8, Name = "z", Address=103 }); 

想過濾清單,所以我使用下面的代碼。但代碼返回ID列表。我想要List of People對象與匹配的ID。

var filteredList = p2.Select(y => y.Id).Intersect(p1.Select(z => z.Id)); 
+1

'加入'P1和P2在Id – ASh

+0

你到底在做什麼?你是否想要一個人員列表中存在相同ID的人員集合? – DavidG

+1

'人'的同一'Id'有不同的名字怎麼可能? 你究竟想達到什麼目的? – llouk

回答

7

你與Join

var filteredList = p2.Join(p1, 
     people => people.Id, 
     person => person.Id, 
     (people, _) => people) 
    .ToList(); 

方式由您提供的密鑰相匹配來自列表中的項目更好 - IdPeople類和PersonId。 對於每一對,其中people.Id == person.Id它應用選擇器功能(people, _) => people。功能說爲每一對匹配的peopleperson只給我people實例;我不在乎person

+0

您能否介紹一下它的工作原理。我不明白 - p => p.Id,p => p.Id,(people,_)=> people – user2323308

+0

@ user2323308 - 請檢查是否[SO Documentation](http:// stackoverflow。com/documentation/c%23/68/linq-queries/2994/joins-inner-left-right-cross-and-full-outer-join#t = 201608191121456680136) –

+0

簡單的說: p1'由p2中的'Id'字段和'p1'中的'ID'以及來自'p2_item'和p'1_item'對的選擇'p2_item' – Artiom

0

像這樣的東西應該做的伎倆:

var result= p1.Join(p2, person => person.Id, people => people.Id, (person, people) => people); 
+1

Looks幾乎相同http://stackoverflow.com/a/39037605/797249 – Artiom

0

如果列表足夠大,你應該使用哈希集合對其進行過濾和提高性能

var hashedIds = new HashSet<int>(p1.Select(p => p.Id)); 
var filteredList = p2.Where(p => hashedIds.Contains(p.Id)).ToList(); 

這將工作和工作速度非常快,因爲像Dictionary或HashSet這樣的哈希集合允許執行快速查找,其複雜性幾乎爲O(1)(這實際上意味着爲了查找具有特定哈希編譯器kn確切地說在哪裏尋找它。與List<T>找到某些元素編譯器將不得不循環整個集合才能找到它。

例如行:p2.Where(p => p1.Contains(p.Id)).ToList(); 具有O(N2)的複雜性,因爲使用.Where和.Contains將形成嵌套循環。

不要使用最簡單的答案(和方法),使用更適合您的需求的答案。

Simple performance test against .Join() ...

和較大的集合是更差它將使。

+0

你是對的,這將工作得更快,但也許可以解釋爲什麼:) –

+1

@GiladGreen謝謝你,我已經更新了我的答案 – Fabjan

+0

加入複雜性:http ://stackoverflow.com/a/2799543/1506454;至於性能測試,如果獨特的Ids數量不是20k中的100,而是20k中的20k,'Join'是非常快的 – ASh