9

我有一些生成字符串列表的 LINQ 代码,如下所示:

var data = from a in someOtherList
           orderby a
           select FunctionThatReturnsString(a);

如何将该字符串列表转换为一个大的串联字符串?假设数据有这些条目:

"Some "
"resulting "
"data here."

我应该得到一个看起来像这样的字符串:

"Some resulting data here."

我怎样才能快速做到这一点?我想过这个:

StringBuilder sb = new StringBuilder();
data.ToList().ForEach(s => sb.Append(s));
string result = sb.ToString();

但这似乎不对。如果这是正确的解决方案,我将如何将其转变为扩展方法?

4

7 回答 7

22

怎么样:

public static string Concat(this IEnumerable<string> source) {
    StringBuilder sb = new StringBuilder();
    foreach(string s in source) {
        sb.Append(s);
    }
    return sb.ToString();
}

和:

string s = data.Concat();

这样就不需要额外的ToList()/ToArray()步骤了。

于 2009-07-14T23:02:23.113 回答
16

你试过 String.Join 吗?如果您已经愿意承担 .ToList 调用的开销,那么请改用 .ToArray() 并将其与对 String.Join 的调用结合使用。

var joined = String.Concat(someQuery.ToArray());

注意:我的解决方案可能不是最快的,因为它涉及到阵列中的一些开销。我的怀疑是走更多马克的路线会更快。但在大多数情况下,如果您只是在寻找快速而肮脏的代码方式,那么我的路线将起作用。

于 2009-07-14T23:01:29.090 回答
3

像这样使用“聚合”:

    List<string> strings = new List<string>() {"bob", "steve", "jane"};
    string result = strings.Aggregate((working, next) => working + next);
    Console.WriteLine(result);

注意:Aggregate 作为扩展方法位于 System.Linq 命名空间中。

于 2009-07-14T23:04:49.210 回答
1
data.ToList().Aggregate(new StringBuilder(), (sb, s) => sb.Append(s)).ToString();
于 2009-07-15T00:25:14.613 回答
1

您可以使用此语句。String.Join("",someOtherList);

于 2016-05-12T07:41:28.573 回答
0

根据 JIT 优化它的方式,使用 StringBuilder 的 string.Concat() 或 Marc 方法可能会更快。由于您在这里使用 Linq,我假设性能不是绝对的 #1 要求,在这种情况下,我会选择最容易阅读的:

string.Concat(data.ToArray());

编辑:当且仅当数据是值类型的 IEnumerable 时,您需要将其转换为 IEnumerable<object>:

string.Concat(data.Cast<object>().ToArray())

编辑 2:我并不是说 Linq 很慢。我只是说我提到的两种方式之间的速度差异应该是非常小的,即使是可以测量的。

编辑 3:JIT 优化了 String 类上的几乎所有操作,因此对 string.Concat 的内部运行时的单个调用确实比使用 StringBuilder 更快。我不确定它是不是,但你应该测试它以确保。

于 2009-07-14T23:10:18.603 回答
0

选择:

>>> data = ['Some ', 'resulting ', 'data here.']
>>> s = ''.join(data)
>>> s
'Some resulting data here.'
于 2013-07-18T18:45:14.177 回答