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



我有一个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));

相关内容

  • 没有找到相关文章

最新更新