我有一个生成的字符串列表,像这样的一些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();
但是,这只是看起来不正确。 如果它是正确的解决方案,我怎么会去把这个变成一个扩展方法?
怎么样:
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()
的一步。
您是否尝试过的string.join? 如果你已经愿意接受.ToList调用的开销则改用.ToArray(),并与到的string.join呼叫相结合。
var joined = String.Concat(someQuery.ToArray());
注:我的解决方案很可能不是最快的,因为它涉及到阵列中的一些开销。 我怀疑,这将是速度,走的更Marc的路线。 但在大多数情况下,如果你只是在寻找快速和肮脏的方式做到这一点的代码,我的路线会工作。
使用“集合”是这样的:
List<string> strings = new List<string>() {"bob", "steve", "jane"};
string result = strings.Aggregate((working, next) => working + next);
Console.WriteLine(result);
注意:汇总是在System.Linq的命名空间的扩展方法。
data.ToList().Aggregate(new StringBuilder(), (sb, s) => sb.Append(s)).ToString();
您可以使用此语句。 的string.join( “”,someOtherList);
根据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的速度更快。 我不知道它是,但你应该对其进行测试,以确保。
替代方案:
>>> 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?