将两个列表与不同的对象相交
我有一个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
,这似乎不是这里的情况。 因此,您需要添加此实现或使用接受自定义IEqualityComparer
的Intersect
重载。
不需要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
的重载,该重载接受自定义比较类的实例