我有一些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();
但这似乎并不合适。如果这是正确的解决方案,我将如何将其转变为扩展方法?
答案 0 :(得分: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()
步骤。
答案 1 :(得分:16)
你试过String.Join吗?如果您已经愿意承担.ToList调用的开销,那么请使用.ToArray()并将其与对String.Join的调用结合起来。
var joined = String.Concat(someQuery.ToArray());
注意:我的解决方案可能不是最快的,因为它涉及阵列中的一些开销。我的怀疑是,走Marc的路线会更快。但在大多数情况下,如果您只是在寻找快速而肮脏的方式在代码中执行此操作,我的路线将起作用。
答案 2 :(得分:3)
像这样使用“Aggregate”:
List<string> strings = new List<string>() {"bob", "steve", "jane"};
string result = strings.Aggregate((working, next) => working + next);
Console.WriteLine(result);
注意:Aggregate在System.Linq命名空间中作为扩展方法。
答案 3 :(得分:1)
data.ToList().Aggregate(new StringBuilder(), (sb, s) => sb.Append(s)).ToString();
答案 4 :(得分:1)
您可以使用此声明。 的string.join( “”,someOtherList);
答案 5 :(得分:0)
根据JIT如何优化它,string.Concat()或Marc的StringBuilder方法可能更快。既然你在这里使用Linq,我会假设性能不是绝对的#1要求,在这种情况下,我会选择最简单的方法:
string.Concat(data.ToArray());
编辑:当且仅当数据是值类型的IEnumerable时,您需要将其强制转换为IEnumerable&lt; object&gt;:
string.Concat(data.Cast<object>().ToArray())
编辑2:我并不认为Linq很慢。我的意思是,如果可测量的话,我提到的两种方式之间的速度差异应该非常小。
编辑3:JIT优化了String类上的几乎所有操作,因此对string.Concat的内部运行时的单次调用确实比使用StringBuilder更快。我不确定是不是,但你应该测试它以确保它。
答案 6 :(得分:0)
替代:
>>> data = ['Some ', 'resulting ', 'data here.']
>>> s = ''.join(data)
>>> s
'Some resulting data here.'