web-dev-qa-db-ja.com

MinまたはMaxを使用しているときにLINQでnullを処理する方法は?

次のLinqクエリがあります。

result.Partials.Where(o => o.IsPositive).Min(o => o.Result)

Result.Partials.Where(o => o.IsPositive)に要素が含まれていない場合、例外が発生します。操作を2つに分割してnullをチェックする以外に、これを処理するエレガントな方法はありますか?このような操作でいっぱいのクラスがあります。

編集:質問はLINQ to Objectsに関連しています。

これは私が得ている例外です(翻訳された:シーケンスは空です):

enter image description here

32

最小の計算の短い要約

_   var min = result.Partials.Where(o => o.IsPositive).Min(o => o.Result);
_

これはあなたの場合です。一致する要素がない場合、Min呼び出しは例外(InvalidOperationException)を発生させます。

_ var min = result.Partials.Where(o => o.IsPositive)
                          .Select(o => o.Result)
                          .DefaultIfEmpty().Min();
_

リストに要素がない場合、DefaultIfEmptyは0要素の列挙を作成します。 0がMinであるか、0が要素のないリストを表していることをどのように知っていますか?

_   var min = result.Partials.Where(o => o.IsPositive)
                            .Min(o => (decimal?)o.Result);
_

ここで、minはnull(defaul(decimal?))または実際に検出されたMinのいずれかです。したがって、この結果のコンシューマーは、結果がnullの場合、リストに要素がなく、結果が10進数の値である場合、リストにいくつかの要素があり、それらの要素のMinがその値であることを認識します。

ただし、これが重要でない場合は、min.GetValueOrDefault(0)を呼び出すことができます。

59
Adrian Iftode

DefaultIfEmptyメソッドを使用して、コレクションに少なくとも1つのアイテムがあることを確認できます。

result.Partials.Where(o => o.IsPositive).Select(o => o.Result).DefaultIfEmpty().Min();
8
Kendall Frey

シーケンスが空の場合、Min(またはMax)は使用できません。それが起こらない場合、resultの定義方法に別の問題があります。それ以外の場合は、シーケンスが空であるかどうかを確認し、適切に処理する必要があります。例:

var query = result.Partials.Where(o => o.IsPositve);
min = query.Any() ? query.Min(o => o.Result) : 0; // insert a different "default" value of your choice...    
7
Jon

LINQで表現するさらに別の方法は、 Aggregate を使用することです。

var min = result.Partials
    .Where(o => o.IsPositive)
    .Select(o => o.Result)
    .Aggregate(0, Math.Min); // Or any other value which should be returned for empty list
1
Ed'ka