2010-03-29 10 views

Odpowiedz

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: usunięty Gdzie(), umieszczony w FirstOrDefault (predykat), dzięki Jurij

+3

Nie potrzebujesz Where, użyj http://msdn.microsoft.com/en-us/library/bb549039.aspx –

+0

'.FirstOrDefault (x =>! String.IsNullOrEmpty (x))' z opcjonalnym ' ?? string.Empty', jeśli nie chcesz zerować. – Will

+0

@Yuriy jest aktualizowany niepotrzebne Gdzie usunięty .. – dan

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

Called tak:

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

Zdefiniować metodę rozszerzenia:

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

Teraz można powiedzieć, co następuje:

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

+1 dla przedłużenia chłodzenia – stmax

+1

Eh. S'kay, ale nie leniwy - oceniany. – Will

+0

Jeśli pierwsza wartość nie jest pusta lub zerowa, to nadal będzie sprawdzać wszystkie pozostałe wartości, z wyjątkiem ostatniej. Cztery wywołania funkcji, które wystarczyłyby. –

1

Jeśli ciągi są w IEnumerable można użyć First lub FirstOrDefault:

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

1) ta odpowiedź została już podana 2) 'Pierwszy' rzuca IOE, jeśli wszystkie ciągi są puste lub puste – Will

+0

@Will, 1) Myślę, że byłem pierwszy, który zasugerował/FirstOrDefault jako oczywista alternatywa dla Where. 2) Pytający nie określa pożądanego zachowania w przypadku, gdy wszystkie łańcuchy są puste/puste. Dlatego zasugerowałem obu. –

+0

hmmmm, chodziło o wspomnienie o FOD. Mój błąd. Nie wierzę, że powiedział coś w swoim pytaniu o rzucanie, jeśli wszystkie ciągi są zerowe. Nie powiedziałeś też tego małego, maleńkiego faktu. Rzucanie "pierwszego rzutu" jest czymś, czego ludzie często nie zdają sobie sprawy, a kończy się to obgryzaniem ich w dupę. Wydawało mi się, że czytanie tego może być dla ludzi ważne. – Will

0

Jeśli używasz .NET 3.5 jest to bardzo łatwe z Linq.

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

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

'Pierwszy' ma nadpisanie, które sprawia, że' Gdzie' jest bezcelowe. Ponadto, jeśli wszystkie łańcuchy mają wartość NULL, zostanie zgłoszony wyjątek InvalidOperationException. Co by wyssać tyłek. – Will

+1

Znajduję się w tym miejscu, gdzie() sprawia, że ​​jest bardziej czytelny. Dlaczego miałby on rzucić 'InvalidOperationException'? – jrummell

+0

Otwórz LINQPad i spróbuj tego: '(nowy ciąg [] {(string) null}) First (x =>! String.IsNullOrEmpty (x))' Zobaczysz, że rzuca IOE, ponieważ First() jest przeznaczony do wykonania, jeśli nie ma pasujących wyników. FirstOrDefault() nigdy nie wyrzuca, jeśli nie znaleziono pasujących wyników; po prostu zwraca 'default (T)'. – Will

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

Tak.

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

Brak drzewek wyrażeń, brak nadużycia LINQ, brak ukrytych funkcji językowych. Taki sam czas pracy i student pierwszego roku CS może dowiedzieć się, co robisz.

+0

Czuję się źle z powodu studentów pierwszego roku z CS, którzy są chronieni przed funkcjami językowymi, które sprawiają, że kodowanie jest radością. – Will

+0

@Will: Nadużycia LINQ to poważny problem, który dotyka naszą społeczność, dlatego wszyscy powinniśmy być częścią rozwiązania, a nie problemu. – kervin

+0

BTW Uwielbiam LINQ, właśnie w zeszłym tygodniu przekonwertowałem bibliotekę opartą na XPath na LINQ na XML, a EF to moja ORM z wyboru. – kervin

Powiązane problemy