代码之家  ›  专栏  ›  技术社区  ›  Kevin Bradshaw

比较中的2个列表。net用于多个匹配元素Linq

  •  0
  • Kevin Bradshaw  · 技术社区  · 8 年前

    在里面net如果我有2个列表

    ListA 
    {ID : 1, Value : "foo"}, 
    {ID : 2, Value : "bar"}, 
    {ID : 3, Value : "zoo"}
    
    ListB 
    {ID : 1, ListA_Id : 1, Value "bar"}, 
    {ID : 2, ListA_Id : 3, Value "zoo"}, 
    {ID : 3, ListA_Id : 4, Value "foo"}
    

    如果要在列表B中搜索ListA\u Id字段与列表A中Id匹配的所有元素,可以执行以下操作:

    ListB.Where(x => listA.ID.Contains(x.ListA_Id)).ToList()
    

    但如果我想确保ListA中的两个值都与ListB匹配呢?

    e、 g级 ListA.Id == ListB.ListA_Id && ListA.Value = ListB.Value

    在上述示例中,ListA中的第三个元素将与listB中的第二个元素匹配

    1 回复  |  直到 8 年前
        1
  •  0
  •   Douglas    8 年前

    您可以使用 Any 扩展方法,并将您的条件指定为谓词:

    listB.Where(b => listA.Any(a => a.ID == b.ListA_Id && a.Value == b.Value)).ToList();
    

    这只适用于列表包含少量元素的情况。随着列表变大,这将以指数形式变慢,因为您可能最终会检查 listA 对于 listB .在这种情况下,可能值得转换 listA公司 进入字典以更快地查找:

    var dictA = listA.ToDictionary(a => a.ID);
    var result = listB
        .Where(b => dictA.TryGetValue(b.ListA_Id, out var a) && a.Value == b.Value))
        .ToList();
    
    推荐文章