You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用LINQ查询实现按父ID筛选首个唯一子项?

如何用LINQ实现按父ID筛选每个父项的首个子项?

刚好我之前也处理过类似的需求,你的foreach逻辑很清晰——利用集合已按父项排序的特性,只保留每个Parent.Id第一次出现的子元素。用LINQ实现的话,分两种场景给你方案:

兼容旧.NET版本(.NET Framework/.NET 5及更早)

如果你的项目还在用较旧的.NET版本,可以用GroupBy配合First()来实现:

var result = children
    .GroupBy(c => c.Parent.Id)
    .Select(group => group.First())
    .ToList();

原理很简单:GroupBy会把拥有相同Parent.Id的子项归为一组,因为原集合已经按父项排序,每组的第一个元素就是你要的「首个子项」,最后通过Select提取每组的第一个元素即可。

.NET 6及以上版本(更简洁写法)

如果你的项目基于.NET 6或更高版本,推荐用DistinctBy方法,代码更简洁直观:

var result = children.DistinctBy(c => c.Parent.Id).ToList();

DistinctBy会根据你指定的键(这里是Parent.Id)去重,并且保留每个键第一次出现的元素,完美匹配你的需求。

注意事项

两种方案都依赖于children集合已经按父项排序的前提,这样才能确保取到的是每个父项对应的第一个子元素。如果集合未排序,需要先添加排序逻辑:

// 先排序再筛选
var result = children
    .OrderBy(c => c.Parent.Id)
    .DistinctBy(c => c.Parent.Id)
    .ToList();

内容的提问来源于stack exchange,提问作者CompanyDroneFromSector7G

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 07:34:42