我有两个通过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
使用Join
和Where
.我更喜欢使用连接的查询语法:
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)
虽然您可以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)
我强烈建议保留A
s dictA
而不是listA
,因为它会让你避免为每个查询重建字典.