Вопрос по lambda, linq, stringbuilder, c# – LINQ для добавления к StringBuilder из String []

6

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

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

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

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

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

foreach(String item in stringArray)
{
  stringBuilder.AppendLine(item);
}
мы переименовали StringBuilder и StringArray, чтобы использовать первый символ нижнего регистра. Просто чтобы прояснить, что яссылаясь на переменные экземпляра, а не на типы. Jamie Dixon
я бы неиспользовать команду .Select ... isn´Доступна ли команда ForEach? sebagomez
Да, это...msdn.microsoft.com/en-us/library/zecdkyw2.aspx :) sebagomez

Ваш Ответ

3   ответа
4

Для каждого" метод расширения вместо "Выбрать".

stringArray.ForEach(x => stringBuilder.AppendLine(x));
-1
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);   
    }
} 
</t></t></t>
Что такое ?DoForAll jason
@vladhorby: один взгляд на почемуDoForAll и другие эквивалентные расширения не реализованы:blogs.msdn.com/ericlippert/archive/2009/05/18/... jason
Извини я'У меня был этот метод расширения так долго, я забыл, что это не часть фреймворка. открытый статический класс CommonExtensions {открытый статический void DoForAll <T>(это IEnumerable <T> предметы, действие <T> action) где T: class {if (action == null) выдает новое ArgumentNullException ("действие»); foreach (var item in items) действие (item); }} vladhorby
18

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 это можно перечислить.

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

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

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

Спасибо Джейсон. Ваш ответ объясняет, почему метод Select нене достичь результата, которого я хотел, и почему работает foreach. Я'буду придерживаться foreach. Мне было просто любопытно, чего мне не хватало. Теперь я знаю. Jamie Dixon
Last () гарантированно повторяется? Вместо того, чтобы просто получить stringArray [stringArray.count-1]? Я думаю, что я бы предпочел ToList (); Taemyr

Похожие вопросы