LINQ 的 Min、Max、Average 遇到序列不包含元素时

LINQMinMaxAverage 遇到序列不包含元素时,表现是一样的,我们以 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)

你可能感兴趣的