我有 2 个列表。
var adultList = new List<Dude>();
adultList.Add(new Dude() { ID = 2, Name = "Randy Marsh" });
adultList.Add(new Dude() { ID = 3, Name = "Jimbo Kern" }); // no kids
adultList.Add(new Dude() { ID = 4, Name = "Gerald Broflovski" });
adultList.Add(new Dude() { ID = 5, Name = "Stuart McCormick" });
adultList.Add(new Dude() { ID = 6, Name = "Liane Cartman" });
adultList.Add(new Dude() { ID = 7, Name = "Ned Gerblansky" }); // no kids
var childList = new List<Dude>();
childList.Add(new Dude() { ID = 8, Name = "Stan Marsh", ParentID = 2 });
childList.Add(new Dude() { ID = 9, Name = "Kyle Broflovski", ParentID = 4 });
childList.Add(new Dude() { ID = 10, Name = "Ike Broflovski", ParentID = 4 });
childList.Add(new Dude() { ID = 11, Name = "Kenny McCormick", ParentID = 5 });
childList.Add(new Dude() { ID = 12, Name = "Eric Cartman", ParentID = 6 });
我希望返回一个 Linq 查询,该查询返回成人列表中没有任何 child 的任何 Dudes。结果列表也应该没有空条目(在上面的示例中,应该有一个 Count() 为 2 并且只返回 Jimbo 和 Ned)。
var nullList = new List<Dude>();
nullList.Add(null);
var adultsWithNoChildren = adultList.GroupJoin(
childList,
p => p.ID,
c => c.ParentID,
(p, c) =>
{
if (c.FirstOrDefault() == null) return p;
return null;
})
.Except(nullList);
这是实现这一目标的最佳方法吗?是否有另一个 Linq 函数或其他东西?
我不喜欢创建 nullList 的想法,但这是确保结果列表具有准确计数的唯一方法。
谢谢
最佳答案
我的方法是这样的:
var adultNoChildren = (from adult in adultList
where !childList.Any(child => child.ParentID == adult.ID)
select adult).ToList();
这也可以使用其他 LINQ 语法来完成,但我永远记不得了 :) (关于 .Any 的好处是它会在找到结果后立即停止,因此整个子列表仅针对没有 children )
关于c# - 更好的 Linq 查询,用于过滤没有子项的父列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2970564/