[英]Comparing two list of different objects
我有以下清单。
具有Person对象的一个列表具有Id&Name属性。 带有People对象的其他列表具有Id,Name和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列表。 我想要具有匹配ID的人物列表对象。
var filteredList = p2.Select(y => y.Id).Intersect(p1.Select(z => z.Id));
Join
会更好
var filteredList = p2.Join(p1,
people => people.Id,
person => person.Id,
(people, _) => people)
.ToList();
-该方法将通过您所提供的密钥相匹配,从两份名单的项目Id
的的People
类和Id
的Person
类。 对于对people.Id == person.Id
每个配对,它将应用选择器功能(people, _) => people
。 函数说,每对匹配的people
person
都给我people
实例; 我不在乎person
。
这样的事情应该可以解决问题:
var result= p1.Join(p2, person => person.Id, people => people.Id, (person, people) => people);
如果列表足够大,则应使用散列集合对其进行过滤并提高性能 :
var hashedIds = new HashSet<int>(p1.Select(p => p.Id));
var filteredList = p2.Where(p => hashedIds.Contains(p.Id)).ToList();
这将非常有效地工作,因为诸如Dictionary或HashSet之类的哈希集合允许以几乎O(1)
复杂度执行快速查找(这实际上意味着,使用某些哈希编译器来查找元素时,它确切地知道要在哪里查找。要找到某些元素编译器的List<T>
,必须循环整个集合才能找到它。
例如,一行: p2.Where(p => p1.Contains(p.Id)).ToList();
具有O(N2)的复杂度,因为同时使用.Where和.Contains会形成嵌套循环。
不要使用最简单的答案(和方法),而应使用最适合您需求的答案。
并且更大的收藏集将带来更多的不同。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.