40

私はこのコードを持っています:

List<int> myList = new List<int>();
var max = myList.Max();
Console.Write(max);

リストに要素がない場合は、int(0)のデフォルト値を使用する必要があります。しかし、代わりにInvalidOperationException、「シーケンスには要素が含まれていない」と述べて、がスローされています。

もちろんAny、またはクエリ構文を使用することもできます(ここのように)。しかし、私は流暢な構文を使用してそれをやりたいです。

どうすればこれを修正できますか?

4

5 に答える 5

96

これを試して:

var myList = new List<int>();
var max = myList.DefaultIfEmpty().Max();
Console.Write(max);

LINQ のDefaultIfEmpty-メソッドは、シーケンスが空かどうかをチェックします。その場合、シングルトン シーケンスが返されます。つまり、要素を 1 つだけ含むシーケンスです。この 1 つの要素には、シーケンスの型の既定値があります。シーケンスに要素が含まれている場合、DefaultIfEmpty-method は単純にシーケンス自体を返します。

詳細については、MSDN を参照してください

于 2012-11-08T08:11:37.013 に答える
3

少し関係はありますが、おそらくまだ有用です..別の解決策は、値をnull許容型にキャストすることです。

var myInt = new Int[0].Max(i=>(int?)i);//myInt == null
于 2014-08-03T17:11:41.987 に答える
0

拡張メソッドとして、@AlvaroRivoir のソリューションは、別の型パラメーターを追加してさらに一般化して拡張できます。

public static K MaxOrDefault<T, K>(this IEnumerable<T> enumeration, Func<T, K> selector) {
    return enumeration.Any() ? enumeration.Max(selector) : default;
}
于 2020-08-27T10:27:34.673 に答える