我有一个ObjA和ObjB列表如下:
List<ObjA> List1;
List<ObjB> List2;
Run Code Online (Sandbox Code Playgroud)
ObjA和ObjB都有一个共同的字段,即User,我希望基于User.Id与它们相交.
class ObjA
{
User user;
.... other properties
}
class ObjB
{
User user;
.... other properties
}
class User
{
int Id;
.... other props
}
Run Code Online (Sandbox Code Playgroud)
如何在Linq上将这两个列表与User.Id相交?
因此,我只想要用户列表.
Jon*_*Jon 33
一般的想法是
var commonUsers = list1.Select(a => a.User).Intersect(list2.Select(b => b.User));
Run Code Online (Sandbox Code Playgroud)
但是,它本身就假定了User实现IEquatable<User>,这似乎不是这种情况.因此,您需要添加此实现或使用Intersect接受自定义的重载IEqualityComparer<User>.
小智 9
1.看这个简单的代码
var result = (from objA in objAList
join objB in objBList on objA.user.Id equals objB.user.Id
select objA/*or objB*/).ToList();
Run Code Online (Sandbox Code Playgroud)
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<ObjA> objAList = new List<ObjA>();
objAList.Add(new ObjA { user = user1 });
objAList.Add(new ObjA { user = user2 });
objAList.Add(new ObjA { user = user3 });
//create objBList
List<ObjB> objBList = new List<ObjB>();
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; }
}
Run Code Online (Sandbox Code Playgroud)
不需要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));
Run Code Online (Sandbox Code Playgroud)
要么
var commonUsers = list1.Select(l1 => l1.User)
.Where(u=> list2.Select(l2 => l2.User.Id)
.Contains(u.Id));
Run Code Online (Sandbox Code Playgroud)