c# - 更好的 Linq 查询,用于过滤没有子项的父列表

标签 c# linq

我有 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/

相关文章:

c# - 是否应该在 foreach 循环中使用 LINQ 表达式?

c# - 使用 linq 取出 foreach

c# - 为什么在从表中选择值时排除 NULL 值

c# - 从 FullyName 字符串到 Type 对象

c# - 如何针对术语优化此 SharePoint 查询?

c# - 在 LINQ 中使用时,语句是否在每次迭代中都重新计算?

c# - "microsoft.visualbasic.fileio does not exist"试图使用 TextFieldParser

c# - 如何配置注解 [Authorize] 以使用枚举?

c# - 使用 Enum as/with 表达式?

c# - 高性能内存缓存的线程安全