LINQ 的 Min、Max、Average 遇到序列不包含元素时,表现是一样的,我们以 Min 进行测试。
序列不包含任何元素
var list = new List<int>(); int result = list.Min(); // 报运行时错误:序列不包含任何元素。 var list = new List<int>() { 1 }; int result = list.Where(m => m > 3).Min(); // 报运行时错误:序列不包含任何元素。
序列是 Nullable 的类型时
var list = new List<int?>(); int result = list.Min(); // 编译通不过。 var list = new List<int?>(); int? result = list.Min(); // result 为 null。 var list = new List<int?>() { null }; int? result = list.Min(); // result 为 null,是:忽略 null 了,并不是因为 null 是最小值。 var list = new List<int?>() { 1, null, 0 }; int? result = list.Min(); // result 为 0,因为忽略 null 了。
序列是类类型时
注意
public class C { public int A { get; set; } public int? B { get; set; } } var list = new List<C>(); var result = list.Min(m => m.A); // 报运行时错误:序列不包含任何元素。 var list = new List<C>(); var result = list.Min(m => m.B); // 这里不报错了,而是 null。
Min 使用查询表达式的 2 种方法
var list = new List<string>() { "itpow", "com" }; int a = list.Min(m => m.Length); int b = list.Select(m => m.Length).Min();
Average 是否计 Nullable 元素?
var list = new List<int?>() { 1, null, 0 }; double? result = list.Average(); // result 为 0.5,不是 0.3333,因为忽略 null 了。
总结
遇不包含元素的序列时,出错:序列不包含任何元素。
遇 null 元素忽略之。
相关阅读
关于 CSharp 值-LINQ、Where、Find 无结果时,返回值如何?
LINQ Min (csharp-examples.net)