我需要将<string,string>
的集合转换为包含集合中所有值的单个字符串,如KeyValueKeyValue ......但我该如何有效地执行此操作?
我现在这样做了:
parameters = string.Join("", requestParameters.Select(x => string.Concat(x.Key, x.Value)));
但不确定这是最好的方法,字符串构建器会更好吗?我猜这个系列最多包含10对。
答案 0 :(得分:5)
有了这么小的集合,没有太多的性能问题,但我可能只是使用StringBuilder来附加所有的值。
像这样:
var sb = new Text.StringBuilder;
foreach (var item in requestParameters)
{
sb.AppendFormat("{0}{1}", item.Key, item.Value);
}
var parameters = sb.ToString();
答案 1 :(得分:5)
string.Join
过去并不是最佳选择,因为它只接受string[]
或object[]
个参数,要求任何select
式查询都需要完全评估,首先放入阵列。
.NET 4.0带来了an overload that accepts IEnumerable<string>
- 这就是你正在使用的 - 甚至是an overload that accepts any IEnumerable<T>
。这些绝对是你最好的选择,因为它们现在是BCL的一部分。
顺便说一句,在Reflector中破解第一次重载的来源会显示与what davisoa suggested非常接近的代码:
public static string Join(string separator, IEnumerable<string> values)
{
if (values == null)
{
throw new ArgumentNullException("values");
}
if (separator == null)
{
separator = Empty;
}
using (IEnumerator<string> enumerator = values.GetEnumerator())
{
if (!enumerator.MoveNext())
{
return Empty;
}
StringBuilder builder = new StringBuilder();
if (enumerator.Current != null)
{
builder.Append(enumerator.Current);
}
while (enumerator.MoveNext())
{
builder.Append(separator);
if (enumerator.Current != null)
{
builder.Append(enumerator.Current);
}
}
return builder.ToString();
}
}
换句话说,如果您要更改此代码以使用StringBuilder
,那么您只需重写MS已为您编写的内容。
答案 2 :(得分:0)
字符串构建器没问题。使用append将每个字符串添加到字符串构建器。
基本上,concat,replace,join,string + string等的唯一原因被认为不是最好的,因为它们都会破坏当前的字符串&amp;重新创造一个新的。
所以当你添加10到12次的字符串时,它真的意味着你会破坏&amp;多次重新创建一个字符串。