Comment faire en sorte que la fonction MAX de LINQ renvoie la valeur par défaut si la séquence est vide?

, j'ai ce code:

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

Je veux que cela s'assure que s'il n'y a pas d'éléments dans la liste, il doit utiliser la valeur par défaut pour int (0). Mais à la place, un InvalidOperationException est lancé, indiquant que la "séquence ne contient aucun élément".

Bien sûr, je pourrais utiliser Any, ou la syntaxe de la requête (comme dans ici). Mais je veux le faire en utilisant la syntaxe fluide.

Comment puis-je résoudre ce problème?

24
demandé sur Community 2012-11-08 12:08:15

3 réponses

, Essayez ceci:

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

La méthode DefaultIfEmpty de LINQ vérifie si la séquence est vide. Si tel est le cas, il retournera une séquence singleton: une séquence contenant exactement un élément. Cet élément a la valeur par défaut du type de la séquence. Si la séquence contient des éléments, la méthode DefaultIfEmpty - retournera simplement la séquence elle-même.

Voir le MSDN pour plus d'Informations

57
répondu Spontifixus 2017-08-30 12:34:19

Légèrement à une tangente, mais peut-être encore utile..une autre solution consiste à convertir la valeur en type nullable;

var myInt = new Int[0].Max(i=>(int?)i);//myInt == null
1
répondu Myles McDonnell 2014-08-03 17:11:41

Si vous utilisez Énumérable.Agrégé, vous n'aurez besoin d'aucune manipulation spéciale pour le cas de liste vide. Essayez ceci:

List<int> myList = new List<int>();
var max = myList.Aggregate(default(int), (seed, i) => (i > seed ? i : seed));
Console.Write(max);
0
répondu Bill Stanton 2018-08-02 18:22:23