以字符串列表转换成一个单一的连接字符串的最快方法?(Fastest way to convert a

2019-07-30 05:18发布

我有一个生成的字符串列表,像这样的一些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();

但是,这只是看起来不正确。 如果它是正确的解决方案,我怎么会去把这个变成一个扩展方法?

Answer 1:

怎么样:

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()的一步。



Answer 2:

您是否尝试过的string.join? 如果你已经愿意接受.ToList调用的开销则改用.ToArray(),并与到的string.join呼叫相结合。

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

注:我的解决方案很可能不是最快的,因为它涉及到阵列中的一些开销。 我怀疑,这将是速度,走的更Marc的路线。 但在大多数情况下,如果你只是在寻找快速和肮脏的方式做到这一点的代码,我的路线会工作。



Answer 3:

使用“集合”是这样的:

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

注意:汇总是在System.Linq的命名空间的扩展方法。



Answer 4:

data.ToList().Aggregate(new StringBuilder(), (sb, s) => sb.Append(s)).ToString();


Answer 5:

您可以使用此语句。 的string.join( “”,someOtherList);



Answer 6:

根据JIT如何优化它,无论是string.Concat()或马克的方法与StringBuilder的可能会更快。 既然你在这里使用LINQ,我会认为表现并不绝对#1的要求,在这种情况下,我用最简单的去阅读:

string.Concat(data.ToArray());

编辑:当且仅当数据是IEnumerable的值类型 ,你需要将它转换为一个IEnumerable <object>:

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

编辑2:我真的不意味着LINQ的速度很慢。 我只能代表我提到的两种方法之间的转速差应该是极小的,如果连测。

编辑3:JIT优化String类几乎所有的操作,所以string.Concat的内部运行的单个呼叫真的可以比使用StringBuilder的速度更快。 我不知道它是,但你应该对其进行测试,以确保。



Answer 7:

替代方案:

>>> data = ['Some ', 'resulting ', 'data here.']
>>> s = ''.join(data)
>>> s
'Some resulting data here.'


文章来源: Fastest way to convert a list of strings into a single concatenated string?