C# - Linq有两个列表

Dan*_*tin 5 c# linq

我有两个通过ID连接在一起的课程:

public class A {
    public int AID;
    public string Name;
}

public class B {
    public int BID;
    public int AID;
}
Run Code Online (Sandbox Code Playgroud)

现在我想过滤我的listB以获取所有B,其中A名称是euqals参数名称:

List<A> listA = ...;
List<B> listB = ...;

public List<B> Filter(string name) {
    var list = listB.Where(**... A.Name == name ...**).ToList();
    return list;
}
Run Code Online (Sandbox Code Playgroud)

我不知道如何使用上面定义的参数过滤listB.也许有人可以帮我搞清楚.

谢谢!

Tim*_*ter 10

使用JoinWhere.我更喜欢使用连接的查询语法:

IEnumerable<B> bs = 
    from a in listA
    join b in listB on a.AID equals b.AID
    where a.Name == name
    select b;
List<B> list = bs.ToList();
Run Code Online (Sandbox Code Playgroud)

避免重复B的另一种方法(如果它是1对多的关系)是使用查找:

ILookup<int, string> aNameLookup = listA.ToLookup(a => a.AID, a => a.Name);
List<B> list = listB.Where(b => aNameLookup[b.AID].Contains(name)).ToList();
Run Code Online (Sandbox Code Playgroud)


das*_*ght 7

虽然您可以B使用b.AID线性搜索过滤s 列表,但效率会很低:

return listB.Where(b => listA.FirstOrDefault(a => a.AID == b.AID)?.Name == name);
Run Code Online (Sandbox Code Playgroud)

更好的方法是将条目listA放入a Dictionary<int,A>,并使用字典查找b.AID:

IDictionary<int,A> dictA = listA.ToDictionary(a => a.AID);
return listB.Where(b => dictA.TryGetValue(b.AID, out var a) && a.Name == name);
Run Code Online (Sandbox Code Playgroud)

我强烈建议保留As dictA而不是listA,因为它会让你避免为每个查询重建字典.