C#从DataTable取最大值时报Sequence contains no elements错误如何解决
错误原因
Sequence contains no elements 错误的触发原因是:Where 条件筛选后得到的行序列为空,要么是当前DataTable没有数据行,要么是所有行的dataComponent字段都无法转换为有效int值,Max方法默认不支持对空序列执行聚合计算。
修复方案
以下方案同时优化了原有代码两次解析int的冗余操作,性能更优:
- 方案1:全.NET版本兼容,使用
DefaultIfEmpty指定空序列默认值
int highestNumber = dt1.Tables[0].AsEnumerable() // 一次解析转换为可空int,无法解析的返回null .Select(x => int.TryParse(x.Field<string>("dataComponent"), out int val) ? val : (int?)null) // 过滤掉无法解析的空值 .Where(x => x.HasValue) .Select(x => x.Value) // 空序列时默认返回0,可根据业务需求调整默认值 .DefaultIfEmpty(0) .Max();
- 方案2:.NET Core 3.0+ / .NET 5+ 及以上版本,直接使用内置
MaxOrDefault方法
int highestNumber = dt1.Tables[0].AsEnumerable() .Select(x => int.TryParse(x.Field<string>("dataComponent"), out int val) ? val : (int?)null) // 空序列时返回默认值0 .MaxOrDefault(0);
- 方案3:先判断是否存在有效值再计算最大值
var validRows = dt1.Tables[0].AsEnumerable() .Where(x => int.TryParse(x.Field<string>("dataComponent"), out int _)) .ToList(); int highestNumber = validRows.Any() ? validRows.Max(m => int.Parse(m.Field<string>("dataComponent"))) : 0;
内容的提问来源于stack exchange,提问作者xyz
相关产品推荐
相关产品推荐

