2010-03-29 19 views

Respuesta

24
var myString = new string[]{first, second, third, fouth, fifth} 
     .FirstOrDefault(s => !string.IsNullOrEmpty(s)) ?? ""; 

//if myString == "", then none of the strings contained a value 

edición: eliminado Donde(), situado en el predicado FirstOrDefault(), gracias Yuriy

+3

No necesita el código Where, use http://msdn.microsoft.com/en-us/library/bb549039.aspx –

+0

'.FirstOrDefault (x =>! String.IsNullOrEmpty (x))' con un 'opcional ?? string.Empty' si no quieres valores nulos. – Will

+0

@Yuriy se actualizó con el innecesario Dónde eliminado ... – dan

8
private static string FirstNonEmptyString(params string[] values) 
    { 
     return values.FirstOrDefault(x => !string.IsNullOrEmpty(x)); 
    } 

Llamado así:

 Console.WriteLine(FirstNonEmptyString(one, two, three, four, five)); 
13

definir un método de extensión:

static string Or(this string value, string alternative) { 
    return string.IsNullOrEmpty(value) ? alternative : value; 
} 

Ahora se puede decir lo siguiente:

string result = str1.Or(str2).Or(str3).Or(str4) … 
+0

+1 para alargar la extensión – stmax

+1

Eh. S'kay, pero no vago-evaluado. – Will

+0

Si el primer valor no es nulo o está vacío, de todos modos se verificará el resto de los valores, excepto el último. Cuatro llamadas de función donde una sería suficiente. –

1

Si las cadenas están en un IEnumerable puede utilizar First o FirstOrDefault:

strings.First(s => !string.IsNullOrEmpty(s)) 
+0

1) Esta respuesta ya fue dada 2) 'Primero' arroja un IOE si todas las cadenas son nulas o están vacías – Will

+0

@Will, 1) Creo que fui el primero en sugerir Primero/FirstOrDefault como una alternativa obvia a Where. 2) El interlocutor no especifica el comportamiento que quiere en el caso de que todas las cadenas sean nulas/vacías. Es por eso que sugerí ambos. –

+0

hmmmm, estaba pasando a la memoria sobre FOD. Mi error. No creo que haya dicho nada en su pregunta sobre tirar si todas las cuerdas son nulas. Tampoco mencionaste ese pequeño hecho teensy. 'Primero 'lanzar es algo que la gente a menudo no se da cuenta y termina mordiéndolos por el culo. Pensé que podría ser importante para la gente que lee ver eso. – Will

0

Si está utilizando .NET 3.5 esto es muy fácil con Linq.

string[] strings = new[] {"", "a", "b", ""}; 

string firstNotNullOrEmpty = 
    strings.Where(s => !String.IsNullOrEmpty(s)).FirstOrDefault(); 
+1

'First' tiene una anulación que hace que el' Dónde' no tenga sentido. Además, si todas las cadenas son nulas, arrojarías una InvalidOperationException aquí. Que mamaría el culo – Will

+1

Creo que incluir el Where() lo hace más legible. ¿Por qué lanzaría 'InvalidOperationException'? – jrummell

+0

abra LINQPad y pruebe esto: '(nueva cadena [] {(cadena) nulo}). Primero (x =>! Cadena.IsNullOrEmpty (x))' Verá que arroja una IOE, como Primero() es diseñado para hacer si no hay resultados coincidentes. FirstOrDefault() nunca arroja si no se encuentran resultados coincidentes; simplemente devuelve 'default (T)'. – Will

1
var found = new[]{first, second, third, fourth, fifth}.FirstOrDefault(x =>!String.IsNullOrEmpty(x)); 
0

Sí.

string selected = null; 
foreach(string currStr in strArray) 
    if(String.IsNullOrEmpty(currStr)==false) 
    { 
     selected = currStr; 
     break; 
    } 

Sin árboles de expresión, sin abuso de LINQ, sin características de lenguaje oscuro. El mismo rendimiento en el tiempo de ejecución y un estudiante de CS de primer año pueden descubrir lo que estás haciendo.

+0

Me siento mal por los estudiantes de primer año de CS que se mantienen a salvo de las características del lenguaje que hacen que codificar sea una alegría. – Will

+0

@Will: el abuso de LINQ es un problema grave que afecta a nuestra comunidad, permite que todos sean parte de la solución, no el problema. – kervin

+0

BTW Me encanta LINQ, acabo de convertir una biblioteca basada en XPath a LINQ a XML la semana pasada, y EF es mi ORM de elección. – kervin

Cuestiones relacionadas