Saltar al contenido

FirstOrDefault: valor predeterminado distinto de null

Te sugerimos que revises esta solución en un entorno controlado antes de enviarlo a producción, un saludo.

Solución:

Según tengo entendido, en Linq el método FirstOrDefault() puede devolver un valor predeterminado de algo que no sea null.

No. O más bien, es siempre devuelve el valor predeterminado para el tipo de elemento… que es un null referencia, la null valor de un tipo de valor que admite valores NULL, o el valor natural “todo ceros” para un tipo de valor que no acepta valores NULL.

¿Hay alguna forma particular de configurar esto para que, si no hay ningún valor para una consulta en particular, se devuelva algún valor predefinido como valor predeterminado?

Para los tipos de referencia, solo puede usar:

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

Por supuesto que esto además darle el “otro valor predeterminado” si el primer valor está presente, pero es un null referencia…

Puede usar DefaultIfEmpty seguido de First:

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

Caso general, no solo para tipos de valor:

static class ExtensionsThatWillAppearOnEverything

    public static T IfDefaultGiveMe(this T value, T alternate)
    
        if (value.Equals(default(T))) return alternate;
        return value;
    


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

Nuevamente, esto realmente no puede decir si hay era cualquier cosa en su secuencia, o si el primer valor era el predeterminado.

Si te importa esto, podrías hacer algo como

static class ExtensionsThatWillAppearOnIEnumerables

    public static T FirstOr(this IEnumerable source, T alternate)
    
        foreach(T t in source)
            return t;
        return alternate;
    

y usar como

var result = query.FirstOr(otherDefaultValue);

aunque, como señala Mr. Steak, esto se podría hacer igual de bien .DefaultIfEmpty(...).First().

Aquí puedes ver las reseñas y valoraciones de los usuarios

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags : / /

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *