2010-03-29 15 views

risposta

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 

Edit: rimosso Dove(), posto predicato FirstOrDefault(), grazie Yuriy

+3

Non è necessario il percorso Where, utilizzare http://msdn.microsoft.com/en-us/library/bb549039.aspx –

+0

'.FirstOrDefault (x =>! String.IsNullOrEmpty (x))' con un'opzione ' ?? string.Empty' se non vuoi null. – Will

+0

@Yuriy è aggiornato con l'inutile Dove rimosso .. – dan

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

Chiamato in questo modo:

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

definire un metodo di estensione:

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

Ora si può dire quanto segue:

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

+1 per l'estensione coolness – stmax

+1

Eh. S'kay, ma non pigramente valutato. – Will

+0

Se il primo valore non è nullo o vuoto, questo controllerà comunque tutti gli altri valori, tranne l'ultimo. Quattro chiamate di funzione dove sarebbe sufficiente. –

1

Se le stringhe sono in una IEnumerable è possibile utilizzare First o FirstOrDefault:

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

1) questa risposta era già stata data 2) 'Prima' lancia un IOE se tutte le stringhe sono nulle o vuote – Will

+0

@Will, 1) Penso di essere stato il primo a suggerire Prima/FirstOrDefault come ovvia alternativa a Where. 2) L'interrogante non specifica il comportamento che desidera nel caso in cui tutte le stringhe siano nulle/vuote. Ecco perché ho suggerito entrambi. –

+0

hmmmm, stava andando sul ricordo di FOD. Colpa mia. Non credo che abbia detto nulla nella sua domanda sul lancio se tutte le stringhe sono nulle. Anche tu non hai detto questo piccolo fatto. "Il primo lancio è qualcosa che le persone spesso non realizzano e finisce per mangiarle nel culo. Ho pensato che potrebbe essere importante per le persone leggere per vederlo. – Will

0

Se stai usando .NET 3.5 questo è molto facile con Linq.

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

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

'First' ha un override che rende il' Where' inutile. Inoltre, se tutte le stringhe sono nulle, invierete qui una eccezione InvalidOperationException. Quale sarebbe il culo. – Will

+1

Trovo che includere Where() lo renda più leggibile. Perché dovrebbe lanciare "InvalidOperationException"? – jrummell

+0

apri LINQPad e prova questo: '(nuova stringa [] {(stringa) null}). Primo (x =>! String.IsNullOrEmpty (x))" Vedrai che getta un IOE, poiché First() è progettato per fare se non ci sono risultati corrispondenti. FirstOrDefault() non getta mai se non vengono trovati risultati corrispondenti; restituisce semplicemente '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; 
    } 

Nessun albero di espressione, nessun abuso di LINQ, nessuna caratteristica del linguaggio oscuro. La stessa performance runtime e uno studente CS del primo anno possono capire cosa stai facendo.

+0

Mi sento male per gli studenti CS del primo anno che sono al sicuro da caratteristiche linguistiche che rendono la programmazione una gioia. – Will

+0

@Will: l'abuso di LINQ è un problema serio che riguarda la nostra comunità, fa sì che tutti siano parte della soluzione, non il problema. – kervin

+0

BTW Amo LINQ, ho appena convertito una libreria basata su XPath in LINQ in XML la settimana scorsa, e EF è il mio ORM di scelta. – kervin

Problemi correlati