我有两个来自此对象的列表
class ObjA
{
int id
string name
}
1 foo1
2 foo2
3 foo3
4 foo4
5 foo5
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
(第一个清单的全部内容)
我错过了什么?
答案 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));