Pytanie w sprawie c#, stringbuilder, linq, lambda – LINQ do dołączenia do StringBuilder z String []

6

Mam tablicę String, którą chcę dodać do konstruktora ciągu za pomocą LINQ.

W zasadzie staram się powiedzieć, że „Dla każdego elementu w tej tablicy dodaj linię do tego StringBuildera”.

Mogę to zrobić całkiem łatwo za pomocą pętli foreach, ale poniższy kod nie robi nic. czego mi brakuje?

stringArray.Select(x => stringBuilder.AppendLine(x));

Gdzie to działa:

foreach(String item in stringArray)
{
  stringBuilder.AppendLine(item);
}
Zmieniłem nazwę StringBuilder i StringArray tak, aby używała pierwszej litery pierwszego znaku. Aby wyjaśnić, że mam na myśli zmienne instancji, a nie typy. Jamie Dixon
nie użyłbym polecenia .Select ... czy polecenie ForEach nie jest dostępne? sebagomez

Twoja odpowiedź

3   odpowiedź
-1
stringArray.DoForAll(x => StringBuilder.AppendLine(x));

Gdzie,DoForAll to metoda rozszerzenia:

public static class CommonExtensions 
{ 
    public static void DoForAll<T>(this IEnumerable<T> items, Action<T> action) where T: class 
    { 
        if (action == null) 
            throw new ArgumentNullException("action"); 
        foreach (var item in items) 
            action(item);   
    }
} 
Co jestDoForAll? jason
@vladhorby: Jeden widok na dlaczegoDoForAll i inne równoważne rozszerzenia nie są zaimplementowane:blogs.msdn.com/ericlippert/archive/2009/05/18/… jason
Przepraszam, od tak dawna korzystam z tej metody rozszerzania, zapomniałem, że nie jest częścią struktury. public static class CommonExtensions {public static void DoForAll <T> (to IEnumerable <T> elementy, Action <T> akcja) gdzie T: class {if (akcja == null) wrzuca nowy ArgumentNullException („akcja”); foreach (var item in items) akcja (element); }} vladhorby
4

Użyj metody rozszerzenia „ForEach” zamiast „Wybierz”.

stringArray.ForEach(x => stringBuilder.AppendLine(x));
18

StringBuilder builder = StringArray.Aggregate(
                            new StringBuilder(),
                            (sb, s) => sb.AppendLine(s)
                        );

Alternatywnie, jakLuke wskazałem w komentarzu na inny post, można powiedzieć

Array.ForEach(StringArray, s => stringBuilder.AppendLine(s));

Powód tegoSelect nie działa, ponieważSelect służy do projekcji i tworzeniaIEnumerable projekcji. Więc linia kodu

StringArray.Select(s => stringBuilder.AppendLine(s))

nie iteruje poStringArray powołaniestringBuilder.AppendLine(s) na każdej iteracji. Raczej tworzyIEnumerable<StringBuilder> które można wyliczyć.

Przypuszczam, że mógłbyś powiedzieć

var e = stringArray.Select(x => stringBuilder.AppendLine(x));
StringBuilder sb = e.Last();
Console.WriteLine(sb.ToString());

ale to jest naprawdę ohydne.

Dzięki Jason. Twoja odpowiedź wyjaśnia, dlaczego metoda Select nie osiągnęła pożądanego rezultatu i dlaczego foreach działał. Będę trzymać się foreach. Byłem naprawdę ciekawy, czego mi brakuje. Teraz wiem. Jamie Dixon
Czy Last () gwarantuje iterację? Zamiast pobierać stringArray [stringArray.count-1]? Myślę, że wolałbym ToList (); Taemyr

Powiązane pytania