交叉两个具有相同对象但不同变量的列表

时间:2016-06-20 18:36:29

标签: c#

我有两个来自此对象的列表

class ObjA
{ 
  int id
  string name
}

list1示例:

1 foo1

2 foo2

3 foo3

4 foo4

5 foo5

list2示例:

3 foo1

5 foo3

2 foo5

我想做这样的事情:

list<objA> intersect = list1.Select(a => a.name).Intersect(list2.Select(b => b.name));

但我希望结果是:

结果:

1 foo1

3 foo3

5 foo5

(第一个清单的全部内容)

我错过了什么?

2 个答案:

答案 0 :(得分:1)

您可以覆盖Equals上的GetHashCode(和ObjA)来定义&#34;等同&#34; as&#34;具有相同的名称&#34;,创建一个使用相同规则实现IEqualityComparer<ObjA>的类,或者只使用不同的Linq查询:

List<ObjA> intersect = list1.Where(x => list2.Any(y => y.name == x.Name)).ToList();

答案 1 :(得分:-1)

你可以做到

var interset = list1.Where(a => list2.Any(b => a.name = b.name)).ToList();

如果列表可能很大,您可能希望从第二个列表中进行查找

var lookup = list2.ToLookup(x => x.name);
var insterset = list1.Where(a => lookup.Contains(a.name));

或者只是HashSet名称

var lookup = new HashSet<string>(list2.Select(x => x.name));
var insterset = list1.Where(a => lookup.Contains(a.name));