如何解决System.Linq.dll中Sequence contains no elements异常?
解决Sequence contains no elements异常问题
你的代码抛出System.InvalidOperationException(提示“Sequence contains no elements”),核心原因是**Aggregate方法在处理空序列时会触发这个异常**——当MenuSwitchInfo为空、为null,或者Where(ms => ms.IsActive)过滤后没有符合条件的元素时,Aggregate没有初始值就会报错。
你尝试的DefaultIfEmpty()之所以没用,是因为它被放在Where之前:给空集合添加的默认null元素,会被后续的Where(ms => ms.IsActive)过滤掉(null访问IsActive会抛空引用,或直接不满足条件),最终还是空序列,Aggregate依然报错。
以下是几种可行的解决思路:
1. 给Aggregate指定初始值
给Aggregate传入初始空字符串,同时调整聚合逻辑,空序列时直接返回初始值:
return MenuSwitchInfo? .Where(ms => ms.IsActive) .Select(ms => ms.Id.ToString()) .Aggregate(string.Empty, (a, b) => string.IsNullOrEmpty(a) ? b : $"{a}, {b}") .Trim();
2. 先判断序列是否为空再执行聚合
先检查过滤后的序列是否有元素,无元素时直接返回空字符串:
var activeIds = MenuSwitchInfo?.Where(ms => ms.IsActive).Select(ms => ms.Id.ToString()) ?? Enumerable.Empty<string>(); return activeIds.Any() ? activeIds.Aggregate((a, b) => $"{a}, {b}").Trim() : string.Empty;
3. 用string.Join替代Aggregate(推荐)
string.Join本身支持空序列,会直接返回空字符串,写法更简洁:
return string.Join(", ", MenuSwitchInfo?.Where(ms => ms.IsActive).Select(ms => ms.Id.ToString()) ?? Enumerable.Empty<string>()).Trim();
内容的提问来源于stack exchange,提问作者Zemprof
相关产品推荐
相关产品推荐

