90 votes

Quelle est la meilleure façon de réaliser "MinOrDefault" dans Linq?

Je produis une liste de valeurs décimales à partir d'une expression linq et je veux la valeur minimale non nulle. Cependant, il est tout à fait possible que l'expression linq aboutisse à une liste vide.

Cela lève une exception et il n'y a pas de MinOrDefault pour faire face à cette situation.

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

Quel est le moyen le plus simple de définir le résultat sur 0 si la liste est vide?

139voto

Christoffer Lette Points 4739

Ce que vous voulez, c'est ceci:

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

double result = results.MinOrDefault();

Eh bien, MinOrDefault() n'existe pas. Mais si nous étions à mettre en œuvre nous-mêmes, il ressemblerait à quelque chose comme ceci:

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

Cependant, il existe des fonctionnalités en System.Linq , qui permettra de produire le même résultat (d'une manière légèrement différente):

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

Si l' results séquence contient pas d'éléments, DefaultIfEmpty() va produire une séquence contenant un élément de l' default(T) - qui par la suite, vous pouvez appeler Min() sur.

Si l' default(T) n'est pas ce que vous voulez, ensuite, vous pouvez spécifier votre propre par défaut avec:

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

Maintenant, c'est chouette!

59voto

Marc Gravell Points 482669
 decimal? result = (from Item itm in itemList
                  where itm.Amount != 0
                  select (decimal?)itm.Amount).Min();
 

Notez la conversion en decimal? . Vous obtiendrez un résultat vide s'il n'y en a pas (gérez-le après coup - je vais surtout expliquer comment arrêter l'exception). J'ai également fait une utilisation "non nulle" != plutôt que > .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X