Algo que me encuentro haciendo más y más es verificar que una cadena esté vacía (como en ""
o nula) y un operador condicional.
Un ejemplo actual:
s.SiteNumber.IsNullOrEmpty() ? "No Number" : s.SiteNumber;
Este es solo un método de extensión, es equivalente a:
string.IsNullOrEmpty(s.SiteNumber) ? "No Number" : s.SiteNumber;
Como está vacío y no es nulo, ??
no funcionará. Una string.IsNullOrEmpty()
versión de ??
sería la solución perfecta. Estoy pensando que tiene que haber una forma más limpia de hacerlo (¡espero!), Pero no he podido encontrarlo.
¿Alguien sabe de una mejor manera de hacer esto, incluso si es solo en .Net 4.0?
c#
string
coalesce
null-coalescing-operator
Nick Craver
fuente
fuente
let (|?) x y = if String.IsNullOrEmpty(x) then y else x
y úsalo comos.SiteNumber |? "No Number"
.Respuestas:
No hay una forma integrada de hacer esto. Sin embargo, puede hacer que su método de extensión devuelva una cadena o un valor nulo, lo que permitiría que el operador de fusión funcione. Sin embargo, esto sería extraño, y personalmente prefiero su enfoque actual.
Como ya está utilizando un método de extensión, ¿por qué no hacer uno que devuelva el valor o un valor predeterminado?
fuente
???
embargo, me encantaría algo como un operador en C # 5, quién sabe.item ?? x=> x.ToString() : null;
C # ya nos permite sustituir valores por
null
con??
. Entonces, todo lo que necesitamos es una extensión que convierta una cadena vacía ennull
, y luego la usamos así:Clase de extensión:
fuente
Sé que esta es una vieja pregunta, pero estaba buscando una respuesta y nada de lo anterior se ajustaba a mi necesidad, así como lo que terminé usando:
Uso:
EDITAR: Una forma aún más compacta de escribir esta función sería:
fuente
using System.Linq
Tengo un par de extensiones de utilidad que me gusta usar:
Editar: Inspirado por la respuesta de sfsr, de ahora en adelante agregaré esta variante a mi caja de herramientas:
fuente
@
prefijo en el@default
parámetro? Nunca he visto eso antes.default
como un nombre de variable aunque sea una palabra clave reservada en C #.Un método de extensión un poco más rápido que el propuesto anteriormente quizás:
fuente
code
Public static string Coalesce (esta cadena @this, string @default = "") {return (@this == null || String.IsNullOrWhiteSpace (@this))? @default: @this; }Una de las ventajas del operador de fusión nula es que cortocircuita. Cuando la primera parte no es nula, la segunda parte no se evalúa. Esto puede ser útil cuando la recuperación requiere una operación costosa.
Terminé con:
Uso:
fuente
Simplemente uso un método de extensión NullIfEmpty que siempre devolverá nulo si la cadena está vacía permitiendo ?? (Operador de fusión nula) que se utilizará normalmente.
Entonces esto permite ?? se usa normalmente y hace que el encadenamiento sea fácil de leer.
fuente
¿qué tal un método de extensión de cadena ValueOrDefault ()
o devolver nulo si la cadena está vacía:
Sin embargo, no probé estas soluciones.
fuente
...OrDefault()
sería confuso si no se comportara como el resto de los...OrDefault()
métodos del marco . Nos guste o no, MS ha dado un significado específico a que nombrar y desviarse de ese comportamiento en los métodos personalizados es innecesariamente confuso para los usuarios de su API.Estoy usando un método de extensión Coalesce de cadena propio. Dado que los que están aquí están usando LINQ y están desperdiciando recursos para operaciones que requieren mucho tiempo (lo estoy usando en ciclos cerrados), compartiré el mío:
Creo que es bastante simple, y ni siquiera necesita molestarse con valores de cadena nulos. Úselo así:
Lo uso mucho. Una de esas funciones de "utilidad" sin las que no puedes vivir después de usarla por primera vez :-)
fuente
s2.Coalesce(s3)
se ejecuta incluso cuando no es necesario. Es mejor usar unaNullIfEmpty()
extensión y??
.Me gusta la brevedad del siguiente método de extensión
QQQ
para esto, aunque, por supuesto, ¿un operador como? seria mejor. Pero podemos aumentar esto al permitir que se comparen no solo dos, sino tres valores de opciones de cadena, que encuentra la necesidad de manejar de vez en cuando (vea la segunda función a continuación).fuente
Or
, y usaría laparams
palabra clave, como las otras respuestas, lo que evita definiciones duplicadas para múltiples parámetros.params
, sería mejor no hacerlo para el escenario predeterminado o dos, ya queparams
hace que una matriz se asigne innecesariamente cuando solo tiene una o dos entradas predeterminadas. Después de eso tiene sentido.