在.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中的第二个元素
答案 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();