182 votes

FirstOrDefault: valeur par défaut autre que null

Si j'ai bien compris, sous Linq, la méthode FirstOrDefault() peut renvoyer une valeur Default de quelque chose d'autre que null. Ce que je n'ai pas encore déterminé, c'est quel type d'éléments autres que null peuvent être renvoyés par cette méthode (et une méthode similaire) lorsqu'il n'y a aucun élément dans le résultat de la requête. Existe-t-il un moyen particulier de le configurer pour que, en l'absence de valeur pour une requête particulière, une valeur prédéfinie soit renvoyée en tant que valeur par défaut?

237voto

Jon Skeet Points 692016

Si je comprends bien, dans Linq, la méthode FirstOrDefault() peut retourner une valeur par Défaut de quelque chose d'autre que null.

Pas de. Ou plutôt, elle a toujours retourne la valeur par défaut pour le type d'élément... qui est une référence null, la valeur null de nullable type de la valeur, ou le naturel "tous les zéros" de la valeur pour un non nullable type de valeur.

Est il de quelque façon que ce peut être configuré de sorte que, si aucune valeur n'est pour une requête particulière une valeur prédéfinie est retourné en tant que valeur par défaut?

Pour les types référence, vous pouvez utiliser:

var result = query.FirstOrDefault() ?? otherDefaultValue;

Bien sûr, ce sera également vous donner "l'autre" valeur par défaut" si la première valeur est présente, mais est une référence null...

86voto

Vitamin C Points 31

Vous pouvez utiliser DefaultIfEmpty suivi de First :

 T customDefault = ...;
IEnumerable<T> mySequence = ...;
mySequence.DefaultIfEmpty(customDefault).First();
 

54voto

Rawling Points 21932

Cas général, pas seulement pour les types de valeur:

 static class ExtensionsThatWillAppearOnEverything
{
    public static T IfDefaultGiveMe<T>(this T value, T alternate)
    {
        if (value.Equals(default(T))) return alternate;
        return value;
    }
}

var result = query.FirstOrDefault().IfDefaultGiveMe(otherDefaultValue);
 

Encore une fois, cela ne peut pas vraiment dire s'il y avait quelque chose dans votre séquence, ou si la première valeur était la valeur par défaut.

Si cela vous intéresse, vous pourriez faire quelque chose comme:

 static class ExtensionsThatWillAppearOnIEnumerables
{
    public static T FirstOr<T>(this IEnumerable<T> source, T alternate)
    {
        foreach(T t in source)
            return t;
        return alternate;
    }
}
 

et utiliser comme

 var result = query.FirstOr(otherDefaultValue);
 

bien que, comme le souligne M. Steak, cela pourrait être fait aussi bien de .DefaultIfEmpty(...).First() .

20voto

RB. Points 17993

À partir de la documentation pour FirstOrDefault

[Revient] par défaut(TSource) si la source est vide;

À partir de la documentation de défaut(T):

mots clés par défaut, qui permet de renvoyer la valeur null pour les types référence et zéro pour la valeur numérique des types. Pour les structures, il sera de retour à chaque membre de la structure initialisée à zéro ou la valeur null, selon qu'ils sont de valeur ou des types de référence. Pour nullable types de valeur, par défaut renvoie un Système.Nullable, qui est initialisé comme tout struct.

Par conséquent, la valeur par défaut peut être null ou 0 selon que le type est une référence ou un type de valeur, mais vous ne pouvez pas contrôler le comportement par défaut.

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