繁体   English   中英

比较两个不同对象的列表

[英]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类和IdPerson类。 对于对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会形成嵌套循环。

不要使用最简单的答案(和方法),而应使用最适合您需求的答案。

针对.Join()的简单性能测试

并且更大的收藏集将带来更多的不同。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM