C# 获取集合中属性的最大值,或在序列为空时返回零

C# 获取集合中属性的最大值,或在序列为空时返回零,c#,linq,C#,Linq,为什么GetOrders()不返回任何元素我得到一个InvalidOperationException,序列中没有元素 int maxNumber = GetOrders().Max(o => o.Number); 如何解决此问题,以便在序列为空时获得默认整数值0,否则我希望最大值为序列不为空。如果不使用Linq,您可以执行以下简单操作 var myOrders = GetOrders(); int maxNumber = myOrders.Any() ? myOrders.Max

为什么GetOrders()不返回任何元素我得到一个InvalidOperationException,序列中没有元素

   int maxNumber = GetOrders().Max(o => o.Number);

如何解决此问题,以便在序列为空时获得默认整数值0,否则我希望最大值为序列不为空。

如果不使用Linq,您可以执行以下简单操作

var myOrders = GetOrders();
int maxNumber = myOrders.Any() ? myOrders.Max(o => o.Number) : 0;

不使用Linq,您可以做一些简单的事情,如

var myOrders = GetOrders();
int maxNumber = myOrders.Any() ? myOrders.Max(o => o.Number) : 0;

您可以使用以下重载:

如果您只想选择
int
值,这种方法更简单:

int maxNumber = GetOrders().Select(o => o.Number).DefaultIfEmpty(0).Max(o => o);

您可以使用以下重载:

如果您只想选择
int
值,这种方法更简单:

int maxNumber = GetOrders().Select(o => o.Number).DefaultIfEmpty(0).Max(o => o);

您可以使用聚合扩展方法

var max = elements2.Aggregate(0, (m, o) => Math.Max(m, o.Number));

您可以使用聚合扩展方法

var max = elements2.Aggregate(0, (m, o) => Math.Max(m, o.Number));
或:

或:


我刚刚让它工作:int maxNumber=GetOrders().Select(o=>o.Number).DefaultIfEmpty(0).Max(o=>o);我刚刚让它工作:int maxNumber=GetOrders().Select(o=>o.Number).DefaultIfEmpty(0).Max(o=>o);你几乎有了我的解决方案,请看下面的评论Dave Zych。您的代码不起作用,因为“o”是一个复杂的对象,因此我无法将0放入DefaultIfEmpty(..)中,因为它未编译。@Elisa:同时编辑了我的答案,以提供默认的“empty”
顺序。尽管当您只需要
int
时,您的方法会更好。因此,新的顺序仅在GetOrders没有返回任何元素时使用,对吗?@Elisa:是的。编辑了我的答案以添加您的方法。@seake:建议您保持查询“运行”。使用
DefaultIfEmpty
修改或链接它更容易。然而,主要的缺点不是纳秒级,而是我需要创建一个对象实例的限制,该对象甚至可能没有默认构造函数,或者当我只想有一个0时,哪个构造函数做“昂贵”的事情。但是,第二种方法是预先选择
int
,不管怎样,它更好。你几乎有我的解决方案了,请参见下面的评论Dave Zych。您的代码不起作用,因为“o”是一个复杂的对象,因此我无法将0放入DefaultIfEmpty(..)中,因为它未编译。@Elisa:同时编辑了我的答案,以提供默认的“empty”
顺序。尽管当您只需要
int
时,您的方法会更好。因此,新的顺序仅在GetOrders没有返回任何元素时使用,对吗?@Elisa:是的。编辑了我的答案以添加您的方法。@seake:建议您保持查询“运行”。使用
DefaultIfEmpty
修改或链接它更容易。然而,主要的缺点不是纳秒级,而是我需要创建一个对象实例的限制,该对象甚至可能没有默认构造函数,或者当我只想有一个0时,哪个构造函数做“昂贵”的事情。但是,第二种方法是预先选择
int
,它无论如何都会更好。。。Math.MaxMath.Max查找最大值时很麻烦?这很麻烦。。。Math.MaxMath.Max查找最大值时是否麻烦?