如何用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
相关产品推荐
相关产品推荐

