簡體   English   中英

將兩個具有不同對象的列表相交

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM