我有一个stringbuilder
Stringbuilder b = new StringBuilder();
我想采用一个集合,并使用LINQ从集合中的每个项目追加一个属性名称。这可能。
类似的东西:
myCollection.Select(r=> b.Append(r.PropertyName);
(但这似乎不起作用)
答案 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));