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?
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
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
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);