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()
。