使用 LINQ 在列表中查找顶级父级

joe*_*yth 3 c# linq

我有一个包含 ID 和 ParentID 的用户定义对象列表。该列表看起来像这样。

ParentID     ID
  123        345
  123        456
  456        567
  456        678
  678        789
Run Code Online (Sandbox Code Playgroud)

我需要一个 LINQ 语句来查找顶级父级;也就是说,ParentID 不作为 ID 存在的所有对象(在本例中,只有 123 个)。

这是我到目前为止所拥有的,它返回了 567,678,789。

parentList = baseList.Where(b => !baseList.Select(o => o.ParentID).Distinct().Contains(b.ID)).ToList();
Run Code Online (Sandbox Code Playgroud)

Str*_*ior 5

您当前的查询正在尝试查找其 ID 与任何其他项目的父 ID 不对应的所有项目——换句话说,您正在查找所有无子节点。

听起来您想要的是所有无父节点——那些父 ID 与任何其他项目的 ID 都不匹配的节点。

var ids = new HashSet<int>(baseList.Select(o => o.ID));
var itemsWithNoParent = baseList.Where(o => !ids.Contains(o.ParentID))
    .ToList();
Run Code Online (Sandbox Code Playgroud)

我正在使用 aHashSet<>来确保.Contains()大型集合的合理性能。