LINQ для добавления к StringBuilder из String [] - PullRequest
6 голосов
/ 10 ноября 2009

У меня есть массив String, который я хочу добавить в построитель строк с помощью LINQ.

То, что я в основном пытаюсь сказать, это «Для каждого элемента в этом массиве добавьте строку в этот StringBuilder».

Я могу сделать это довольно легко, используя цикл foreach, однако следующий код, похоже, ничего не делает. Чего мне не хватает?

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

Где, как это работает:

foreach(String item in stringArray)
{
  stringBuilder.AppendLine(item);
}

Ответы [ 3 ]

18 голосов
/ 10 ноября 2009

Если вы настаиваете на том, чтобы делать это LINQy способом:

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

В качестве альтернативы, как Люк указал в комментарии к другому сообщению, вы могли бы сказать

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

Причина, по которой Select не работает, заключается в том, что Select предназначен для проецирования и создания IEnumerable проекции. Итак, строка кода

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

не выполняет итерацию по StringArray, вызывая stringBuilder.AppendLine(s) на каждой итерации. Скорее, он создает IEnumerable<StringBuilder>, который можно перечислить.

Полагаю, вы могли бы сказать

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

но это действительно отвратительно.

4 голосов
/ 21 октября 2010

Используйте метод расширения «ForEach» вместо «Select».

stringArray.ForEach(x => stringBuilder.AppendLine(x));
0 голосов
/ 10 ноября 2009
stringArray.DoForAll(x => StringBuilder.AppendLine(x));

Где, DoForAll - метод расширения:

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);   
    }
} 
...