如何使用LINQ将ResultClass对象列表合并为单个实例?
使用LINQ合并ResultClass列表为单个对象
首先得先修正你原代码里的一个问题:HashSet<T>.Union()方法不会修改原集合,它返回一个包含两个集合元素的新集合,所以你原来的循环代码实际上没把元素合并进去,应该改用UnionWith()方法才对。
接下来是可以替代循环的LINQ实现方式,分两种思路:
方式一:用Aggregate聚合(最贴合LINQ风格)
Aggregate方法能把序列里的元素逐步聚合成单一结果,刚好适配这种合并场景:
var finalResult = listOfResultClass.Aggregate(new ResultClass(), (current, item) => { current.VerifiedResults.UnionWith(item.VerifiedResults); current.UnverifiedResults.UnionWith(item.UnverifiedResults); // 和原循环逻辑一致:每次覆盖IsBlocked,最终取列表最后一个元素的IsBlocked值 current.IsBlocked = item.IsBlocked; return current; });
方式二:先提取所有元素再构建新对象
如果允许调整ResultClass的定义(比如加个构造函数),可以先通过LINQ批量提取所有元素,再直接创建合并后的对象:
首先给ResultClass补充构造函数(原属性set为private,外部无法直接赋值,需要通过构造或者修改setter):
public class ResultClass { public HashSet<string> VerifiedResults { get; private set; } public HashSet<string> UnverifiedResults { get; private set; } public bool IsBlocked { get; private set; } public ResultClass() { VerifiedResults = new HashSet<string>(); UnverifiedResults = new HashSet<string>(); } // 用于合并场景的构造函数 public ResultClass(HashSet<string> verified, HashSet<string> unverified, bool isBlocked) { VerifiedResults = verified; UnverifiedResults = unverified; IsBlocked = isBlocked; } }
然后用LINQ提取元素并创建合并对象:
var finalResult = new ResultClass( new HashSet<string>(listOfResultClass.SelectMany(x => x.VerifiedResults)), new HashSet<string>(listOfResultClass.SelectMany(x => x.UnverifiedResults)), listOfResultClass.LastOrDefault()?.IsBlocked ?? false // 保持原逻辑,取最后一个元素的IsBlocked );
补充说明
如果你的IsBlocked逻辑不是取最后一个元素的值,而是只要列表中有一个元素为true就设为true,可以把最后一行改成listOfResultClass.Any(x => x.IsBlocked),根据实际需求调整即可。
内容的提问来源于stack exchange,提问作者tortuga
相关产品推荐
相关产品推荐

