我有一个stringbuilder
Stringbuilder b = new StringBuilder();
和我想取一个集合,并使用LINQ从集合中的每个项目附加一个属性名。这可能吗?
像这样:
myCollection.Select(r=> b.Append(r.PropertyName);
(但这似乎不起作用)
这将工作(即使它是一个非常迂回的方式做事情),并将工作在任何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));
当一个简单的foreach语句足够表达和简洁时,您不需要强制使用LINQ来解决这个问题。然而,如果你想使用更实用的方法,你可以选择更像string.Join
的东西,我相信它在内部使用了StringBuilder
(但不要引用我的话)。例如
builder.Append(string.Join("", myCollection.Select(r => r.PropertyName)));
但实际上,在你可能看到的所有示例中,它们会比
更详细(或更可读)吗?foreach (var item in myCollection)
builder.Append(item.PropertyName);
?
我会这样写:
String.Concat(myCollection.Select(r => r.PropertyName));
一些集合支持"Each"扩展方法:
myCollection.Each(r => b.Append(r.PropertyName));
编辑:第二看,也许这不是提供开箱即用。我正在考虑List<>类上的"ForEach"方法。无论如何,您可以很容易地编写自己的Each方法:
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);
}
List<string> words = new List<string>()
{
"aaa",
"aab",
"aac",
"aad",
};
StringBuilder sb = new StringBuilder();
words.ForEach(a => sb.AppendFormat("Element {0}n",a));