如何用LINQ从Form列表中提取去重的Subject列表?
使用LINQ合并并去重嵌套的Subject列表
要合并所有Form关联的Subject并按Id去重,可以通过扁平化嵌套集合 + 按Id去重两步实现,以下是具体方案:
1. .NET 6+ 简洁方案(推荐)
.NET 6及以上版本提供了DistinctBy方法,可以直接指定去重的键(这里用Subject.Id),代码最简洁:
// 假设你有Form对象列表 List<Form> forms = GetYourForms(); var uniqueSubjects = forms // 扁平化所有LinkedSubjects,处理null集合避免空引用 .SelectMany(form => form.LinkedSubjects ?? Enumerable.Empty<Subject>()) // 按Subject.Id去重 .DistinctBy(subject => subject.Id) // 转成List(按需选择) .ToList();
2. .NET 6以下兼容方案
如果项目基于.NET 5或更早版本,没有DistinctBy,可以用GroupBy分组后取每组第一个元素:
var uniqueSubjects = forms .SelectMany(form => form.LinkedSubjects ?? Enumerable.Empty<Subject>()) // 按Id分组,同Id的Subject会被分到一组 .GroupBy(subject => subject.Id) // 取每组的第一个元素(即保留该Id首次出现的Subject) .Select(group => group.First()) .ToList();
注意事项
- 上述代码会处理
LinkedSubjects为null的情况(用?? Enumerable.Empty<Subject>()跳过空集合),避免空引用异常。 - 如果存在同一Id但Name不同的Subject,上述方案会保留该Id首次出现的Subject实例。若需要自定义合并逻辑(比如合并Name),可以在
Select阶段对分组后的元素做额外处理。
内容的提问来源于stack exchange,提问作者Hannah Hayes
相关产品推荐
相关产品推荐

