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

时间:2018-04-08 12:48:21

标签: .net list entity-framework

在.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_Id字段与列表A中的Ids匹配的所有元素,我可以这样做:

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

但是如果我想确保ListA中的两个值都与ListB相匹配怎么办?

例如ListA.Id == ListB.ListA_Id && ListA.Value = ListB.Value

ListA中的第三个元素将匹配上例中listB中的第二个元素

1 个答案:

答案 0 :(得分:0)

您可以使用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();