2009-11-10 2 views
7

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

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

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

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

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

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

i wouldn't использовать команду .Select ... isn't доступна команда ForEach? – sebagomez

+0

Я переименовал StringBuilder и StringArray, чтобы использовать нижний регистр первого символа. Просто чтобы было ясно, что я имею в виду переменные экземпляра, а не типы. –

+0

да это ... http://msdn.microsoft.com/en-us/library/zecdkyw2.aspx :) – sebagomez

ответ

18

Если вы настаиваете делать это таким образом, LINQy:

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

Альтернативно, как Luke отметил в комментарии на другом посту, можно сказать, что

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()); 

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

+0

Спасибо Джейсону. Ваш ответ объясняет, почему метод Select не достиг нужного результата и почему foreach работал. Я буду придерживаться прожектора. Мне действительно было любопытно, чего мне не хватало. Теперь я знаю. –

+0

Is Last() гарантированно повторяется? Вместо того, чтобы просто извлекать stringArray [stringArray.count-1]? Думаю, я бы предпочел ToList(); – Taemyr

0

StringArray.DoForAll (х => StringBuilder.AppendLine (х));

+0

Что такое 'DoForAll'? – jason

+0

К сожалению, у меня был такой метод расширения так долго, я забыл, что это не часть фреймворка. \t общественного CommonExtensions статического класса \t { \t \t государственного статическая сила DoForAll (это IEnumerable элементов, Action действия) \t \t \t где T: класс \t \t { \t \t \t если (действие == нуль) \t \t \t \t throw new ArgumentNullException ("действие"); \t \t \t Еогеасп (вар элемент в пунктах) \t \t \t \t действий (пункт); \t \t \t \t} } – vladhorby

+0

@vladhorby: Одна из точек зрения на то, почему 'DoForAll' и другие эквивалентные расширения не реализованы: http://blogs.msdn.com/ericlippert/archive/2009/05/18/foreach-vs -foreach.aspx – jason

6

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

stringArray.ForEach(x => stringBuilder.AppendLine(x)); 
Смежные вопросы