如何使用linq在每个项目上附加到stringbuilder

时间:2011-04-08 03:54:41

标签: c# linq collections

我有一个stringbuilder

Stringbuilder b = new StringBuilder();

我想采用一个集合,并使用LINQ从集合中的每个项目追加一个属性名称。这可能。

类似的东西:

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

(但这似乎不起作用)

5 个答案:

答案 0 :(得分:7)

这样可行(尽管这是一种非常全面的处理方式)并适用于任何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)); 

答案 1 :(得分:5)

当一个简单的foreach语句足够富有表现力和简洁时,你不需要使用LINQ强制解决这个问题。但是,如果你想使用更多功能性的方法,你总是可以选择更像string.Join的东西,我相信它在内部使用StringBuilder(但不要引用我的内容)。如

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

但实际上,在您可能看到的所有示例中,它们是否会比

更简洁(或更具可读性)
foreach (var item in myCollection) 
     builder.Append(item.PropertyName);

答案 2 :(得分:2)

我会把它写成:

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

答案 3 :(得分:1)

某些集合支持“每个”扩展方法:

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

编辑:第二眼看,也许这不是开箱即用的。我正在考虑List&lt;&gt;上的“ForEach”方法类。无论如何,你可以很容易地编写自己的每种方法:

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

答案 4 :(得分:1)

        List<string> words = new List<string>()
        { 
        "aaa",
        "aab",
        "aac",
        "aad",
        };

        StringBuilder sb = new StringBuilder();
        words.ForEach(a => sb.AppendFormat("Element {0}\n",a));