[英]intersect two lists with different objects
我有一個 ObjA 和 ObjB 的列表,如下所示:
List<ObjA> List1;
List<ObjB> List2;
ObjA 和 ObjB 都有一個公共字段,即 User,我想根據 User.Id 將它們相交。
class ObjA
{
User user;
.... other properties
}
class ObjB
{
User user;
.... other properties
}
class User
{
int Id;
.... other props
}
如何將 User.Id 上的這兩個列表與 linq 相交?
結果我只想要用戶列表。
一般的想法是
var commonUsers = list1.Select(a => a.User).Intersect(list2.Select(b => b.User));
但是,本身假定User
實現IEquatable<User>
,這似乎不是這種情況。 因此,您需要添加此實現或使用接受自定義IEqualityComparer<User>
的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<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; }
}
標准方法是使用IEqualityComparer
對象。 默認值使用標准相等比較。 創建一個實現IEqualityComparer
接口的類,並執行所需的比較。 然后,您可以調用IEnumerable.Intersect
的重載,該重載接受自定義比較類的實例
您可以使用擴展方法 Linq
var result = List1.Join(List2, e1 => e1.ID, e2 => e2.ID, (e1, e2)=> e1);
有關更多信息,您可以訪問https://www.tutorialsteacher.com/linq/linq-joining-operator-join
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.