38

FirstOrDefault()nullを返すと起動して例外となる次のLINQクエリがあります。理想的には、ヌルチェックを避けたいと思います。これを行う方法はありますか?呼び出しを満たす0ものがない場合は戻りたいと思います。CPOffsetsFirstOrDefault()

double offset = OrderedOffsets.FirstOrDefault(o => o.OffsetDateTime > cpTime).CPOffset;

これを達成するために私が見ることができる唯一の方法は次のとおりです。

CPOffset cpOffset = OrderedOffsets.FirstOrDefault(o => o.OffsetDateTime > cpTime);
double offset = cpOffset != null ? cpOffset.CPOffset : 0;

別のより簡潔な方法はありますか?Select()後に使用FirstorDefault()するとコンパイルされませんが、ここで適切だと思いましたか?

4

3 に答える 3

64

私はこれがうまくいくはずだと思います、私はそれをチェックするためにVSの近くにいません...

OrderedOffsets.Where(o => o.OffsetDateTime > cpTime).Select(x => x.CPOffset).FirstOrDefault();
于 2013-03-20T23:49:43.360 に答える
13

DefaultIfEmptyコレクションが常に少なくとも 1 つの要素を持つようにするために使用できます。

double offset = OrderedOffsets.Where(o => o.OffsetDateTime > cpTime)
    .Select(o => o.CPOffset)
    .DefaultIfEmpty()
    .First();
于 2013-03-20T23:50:27.403 に答える
5

良いパターンは次のようになると思います:

double offset = (OrderedOffsets.FirstOrDefault(o => o.OffsetDateTime > cpTime) ?? someDefaultObject).CPOffset;

デフォルト値をsomeDefaultObject保持するオブジェクトを使用... このパターンを使用すると、コードを使用してデフォルト値を簡単に変更できます。

OrderedOffsets を構造体にすることができる場合は、デフォルト値をそこに置くこともできます! :)

于 2013-03-21T00:38:29.530 に答える