不支持MinOrDefault扩展

时间:2011-04-05 10:50:33

标签: c# linq

我只是想确认一下

Collection.Min(p => p.Value); 

仅当Collection不为空并且没有MinOrEmpty或类似的东西时才有效,对吧?

3 个答案:

答案 0 :(得分:5)

如果你希望它返回元素类型的默认值(如果它是空的),这很容易:

var min = Collection.Select(p => p.Value).DefaultIfEmpty().Min();

或者,如果您想要特定的最小值:

var min = Collection.Select(p => p.Value)
                    .Concat(Enumerable.Repeat(int.Minvalue, 1)
                    .Min();

或者:

var min = Collection.Select(p => (int?) p.Value)
                    .Min(); // min will be the null value if Collection is empty

这就是你要追求的吗?这还不完全清楚。

MinMax对于非可空元素类型的空序列的行为略微不同于可空元素类型的空序列。当元素类型可为空时,当且仅当序列为空时才返回null值;对于非可空元素类型,抛出InvalidOperationException。有关详细信息,请参阅我的Edulinq blog post on Min/Max

答案 1 :(得分:3)

如果集合包含可空类型 - 引用类型或Nullable<T>值 - 那么如果集合为空,Min方法将返回null

如果集合包含不可为空的值类型,那么如果集合为空,Min方法将抛出InvalidOperationException

请注意,在您的示例中,您将委托传递给Min方法,然后行为由委托的返回类型决定,元素本身的类型

(不,没有内置的MinOrEmpty方法。有很多简单的替代方法,see Jon's answer了解详情。)

答案 2 :(得分:1)

如果序列为空则计算最小值没有意义。但是,如果要在序列为空时返回特定值,则可以这样做(假设您计算的int值的最小值):

int defaultMinValue = -1;
var min = Collection.Select(p => p.Value).DefaultIfEmpty(defaultMinValue).Min();

如果序列为空,它将返回-1,否则它将计算序列的最小值。