93

LINQ 式から 10 進数値のリストを作成していますが、ゼロ以外の最小値が必要です。ただし、LINQ 式の結果が空のリストになる可能性は十分にあります。

これにより例外が発生し、この状況に対処する MinOrDefault はありません。

decimal result = (from Item itm in itemList
                  where itm.Amount > 0
                  select itm.Amount).Min();

リストが空の場合、結果を 0 に設定するにはどうすればよいですか?

4

6 に答える 6

144

What you want is this:

IEnumerable<double> results = ... your query ...

double result = results.MinOrDefault();

Well, MinOrDefault() does not exist. But if we were to implement it ourselves it would look something like this:

public static class EnumerableExtensions
{
    public static T MinOrDefault<T>(this IEnumerable<T> sequence)
    {
        if (sequence.Any())
        {
            return sequence.Min();
        }
        else
        {
            return default(T);
        }
    }
}

However, there is functionality in System.Linq that will produce the same result (in a slightly different way):

double result = results.DefaultIfEmpty().Min();

If the results sequence contains no elements, DefaultIfEmpty() will produce a sequence containing one element - the default(T) - which you subsequently can call Min() on.

If the default(T) is not what you want, then you could specify your own default with:

double myDefault = ...
double result = results.DefaultIfEmpty(myDefault).Min();

Now, that's neat!

于 2010-01-30T09:53:21.320 に答える
60
decimal? result = (from Item itm in itemList
                  where itm.Amount != 0
                  select (decimal?)itm.Amount).Min();

への変換に注意してくださいdecimal?。何もない場合は空の結果が得られます(事後処理するだけです-主に例外を停止する方法を示しています)。!=ではなく、「非ゼロ」の使用も作成し>ました。

于 2010-01-29T22:24:26.340 に答える
0

このアプローチは、 から単一の最小Amount値を返しますitemList。理論的には、これにより、データベースへの複数回のラウンドトリップが回避されるはずです。

decimal? result = (from Item itm in itemList
                  where itm.Amount > 0)
                 .Min(itm => (decimal?)itm.Amount);

null 許容型を使用しているため、null 参照例外は発生しなくなりました。

Anybefore を呼び出すなどの実行メソッドの使用を避けることでMin、データベースへのアクセスは 1 回だけにする必要があります。

于 2015-05-15T10:20:18.260 に答える