C# 使用相同对象但变量不同的两个列表相交

C# 使用相同对象但变量不同的两个列表相交,c#,C#,我有两个来自这个对象的列表 class ObjA { int id string name } 清单1示例: 1 foo1 二○○二 3 foo3 4 foo4 5-5 清单2示例: 3月1日 5月3日 2-5 我想做这样的事情: list<objA> intersect = list1.Select(a => a.name).Intersect(list2.Select(b => b.name)); list intersect=list1.Select(

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

class ObjA
{ 
  int id
  string name
}
清单1示例: 1 foo1

二○○二

3 foo3

4 foo4

5-5

清单2示例: 3月1日

5月3日

2-5

我想做这样的事情:

list<objA> intersect = list1.Select(a => a.name).Intersect(list2.Select(b => b.name));
list intersect=list1.Select(a=>a.name).intersect(list2.Select(b=>b.name));
但我希望结果是:

结果: 1 foo1

3 foo3

5-5

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

我错过了什么?

你可以这么做

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));
var lookup=newhashset(list2.Select(x=>x.name));
var insterset=list1.Where(a=>lookup.Contains(a.name));
你可以这样做

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));
var lookup=newhashset(list2.Select(x=>x.name));
var insterset=list1.Where(a=>lookup.Contains(a.name));

您可以在
ObjA
上覆盖
Equals
(和
GetHashCode
),将“equality”定义为“同名”,创建一个使用相同规则实现
IEqualityComparer
的类,或者只使用不同的Linq查询:

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

您可以在
ObjA
上覆盖
Equals
(和
GetHashCode
),将“equality”定义为“同名”,创建一个使用相同规则实现
IEqualityComparer
的类,或者只使用不同的Linq查询:

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

那么,您希望列表中存在空实例,以便索引保持不变吗?是的。我想从列表1中获取完整的对象,同时只与名称相交。@D.Petrov我认为,通过“第一个列表的完整内容”,OP意味着他们需要
objA
对象,而不仅仅是
name
。因此,您希望列表中存在空实例,以便索引保持不变?是的。我想从列表1中获取完整的对象,同时只与名称相交。@D.Petrov我认为,通过“第一个列表的完整内容”,OP意味着他们需要
objA
对象,而不仅仅是
名称
。如果可以编辑的话。我对你的解决方案进行了一个小编辑。List intersect1=list1.Where(x=>list2.Any(y=>y.name==x.name)).ToList()@Yogi_Bear好吧,这并没有改变任何事情,但我做了那个改变。事实上,我为列表部分做了准备,但是ok@Yogi_Bear好的,我现在明白了。在这种情况下,最后还需要
ToList()
。如果可以编辑。我对你的解决方案进行了一个小编辑。List intersect1=list1.Where(x=>list2.Any(y=>y.name==x.name)).ToList()@Yogi_Bear好吧,这并没有改变任何事情,但我做了那个改变。事实上,我为列表部分做了准备,但是ok@Yogi_Bear好的,我现在明白了。在这种情况下,最后还需要
ToList()