Как я могу добавить к строку строки на каждом элементе usinq linq - PullRequest
2 голосов
/ 08 апреля 2011

У меня есть строитель строк

Stringbuilder b = new StringBuilder();

, и я хочу взять коллекцию и добавить имя свойства для каждого элемента в коллекции, используя LINQ.Возможно ли это.

примерно так:

myCollection.Select(r=> b.Append(r.PropertyName);

(но, похоже, это не работает)

Ответы [ 5 ]

7 голосов
/ 08 апреля 2011

Это будет работать (даже если это очень обходной способ работы) и будет работать на любом IEnumerable<string>:

List<string> foo = new List<string>();
foo.Add("bar");
foo.Add("baz");
StringBuilder result = foo.Aggregate(new StringBuilder(), (a, b) => a.Append(b)); 

Адаптировано к вашему примеру:

StringBuilder result = myCollection.Aggregate(new StringBuilder(), (a, b) => a.Append(b.PropertyName)); 
5 голосов
/ 08 апреля 2011

Вам не нужно форсировать проблему с помощью LINQ, когда простое выражение foreach будет достаточно выразительным и достаточно кратким. Однако, если вы хотите использовать более функционально-ориентированный подход, вы всегда можете пойти на что-то более похожее на string.Join, которое, я считаю, использует StringBuilder внутри (но не цитируйте меня). Такие как

builder.Append(string.Join("", myCollection.Select(r => r.PropertyName)));

Но на самом деле из всех примеров, которые вы можете увидеть, они будут менее подробными (или более читабельными), чем

foreach (var item in myCollection) 
     builder.Append(item.PropertyName);

2 голосов
/ 08 апреля 2011

Я бы написал так:

String.Concat(myCollection.Select(r => r.PropertyName));

1 голос
/ 08 апреля 2011
        List<string> words = new List<string>()
        { 
        "aaa",
        "aab",
        "aac",
        "aad",
        };

        StringBuilder sb = new StringBuilder();
        words.ForEach(a => sb.AppendFormat("Element {0}\n",a));
1 голос
/ 08 апреля 2011

Некоторые коллекции поддерживают метод расширения «Каждый»:

myCollection.Each(r => b.Append(r.PropertyName));

РЕДАКТИРОВАТЬ: на второй взгляд, возможно, это не предусмотрено из коробки. Я думал о методе «ForEach» в классе List <>. В любом случае, вы можете написать свой каждый метод довольно легко:

public static void Each<T>(this IEnumerable<T> items, Action<T> action)
{
    if (items == null) return;

    var cached = items;

    foreach (var item in cached)
        action(item);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...