2016-08-19 92 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