将两个列表与不同的对象相交

我有一个ObjA和ObjB列表如下:

List List1; List List2; 

ObjA和ObjB都有一个公共字段,即User,我希望基于User.Id将它们相交。

 class ObjA { User user; .... other properties } class ObjB { User user; .... other properties } class User { int Id; .... other props } 

如何将这两个列表与Linq上的User.Id相交?

因此,我只想要用户列表。

一般的想法是

 var commonUsers = list1.Select(a => a.User).Intersect(list2.Select(b => b.User)); 

但是,本身假定User实现IEquatable ,这似乎不是这里的情况。 因此,您需要添加此实现或使用接受自定义IEqualityComparerIntersect重载。

不需要IEqualityComparer或IEquatable(无论如何都会更好)

 var commonUsers = list1 .Select(l1 => l1.User) .Where(u => list1 .Select(l => l.User.Id) .Intersect(list2 .Select(l2 => l2.Id)) .Contains(u.Id)); 

要么

 var commonUsers = list1.Select(l1 => l1.User) .Where(u=> list2.Select(l2 => l2.User.Id) .Contains(u.Id)); 

1.看看这个简单的代码

  var result = (from objA in objAList join objB in objBList on objA.user.Id equals objB.user.Id select objA/*or objB*/).ToList(); 

2.完整的代码

  class QueryJoin { static void Main(string[] args) { //create users User user1 = new User { Id = 1, Name = "anuo1" }; User user2 = new User { Id = 2, Name = "anuo2" }; User user3 = new User { Id = 3, Name = "anuo3" }; User user4 = new User { Id = 4, Name = "anuo4" }; User user5 = new User { Id = 5, Name = "anuo5" }; //create objAList List objAList = new List(); objAList.Add(new ObjA { user = user1 }); objAList.Add(new ObjA { user = user2 }); objAList.Add(new ObjA { user = user3 }); //create objBList List objBList = new List(); objBList.Add(new ObjB { user = user3 }); objBList.Add(new ObjB { user = user4 }); objBList.Add(new ObjB { user = user5 }); //intersect var result = (from objA in objAList join objB in objBList on objA.user.Id equals objB.user.Id select objA/*or objB*/).ToList(); } } class ObjA { public User user { get; set; } } class ObjB { public User user { get; set; } } class User { public int Id { get; set; } public string Name { get; set; } } 

标准方法是使用IEqualityComparer对象。 默认值使用标准相等比较。 创建一个实现IEqualityComparer接口的类,并执行所需的比较。 然后,您可以调用IEnumerable.Intersect的重载,该重载接受自定义比较类的实例