我需要将一组 <string,string>
转换为一个包含集合中所有值的单个字符串,例如 KeyValueKeyValue... 但是如何有效地实现呢?
目前我是这样做的:
parameters = string.Join("", requestParameters.Select(x => string.Concat(x.Key, x.Value)));
不确定这是否是最好的方法,使用字符串构建器会更好吗?我猜这个集合将包含最多10对。
string.Join
曾经并不是最佳选项,因为它只接受string[]
或object[]
参数,需要将任何select
风格的查询完全评估并放入数组中。
.NET 4.0带来了一种重载方法,接受IEnumerable<string>
- 这就是你正在使用的 - 甚至一种接受任何IEnumerable<T>
的重载。它们绝对是您的最佳选择,因为它们现在是BCL的一部分。
顺便说一下,在Reflector中打开第一个重载的源代码,显示的代码与davisoa建议的非常接近:
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
,那么您只是在重新编写微软已经为您编写的内容。因为集合很小,所以性能上的问题不大,但我会建议使用StringBuilder将所有的值都添加起来。
像这样:
var sb = new Text.StringBuilder;
foreach (var item in requestParameters)
{
sb.AppendFormat("{0}{1}", item.Key, item.Value);
}
var parameters = sb.ToString();
string.Join
内部的操作(OP似乎在使用.NET 4.0,因此他可以访问接受 IEnumerable<string>
的重载)。 - Dan Tao可以使用字符串构建器。使用append将每个字符串添加到字符串构建器中。
基本上,concat、replace、join、string+string等都被认为不是最好的原因是它们都倾向于销毁当前字符串并重新创建一个新的字符串。
因此,当您添加字符串达到10-12次时,这意味着您将销毁并重新创建那么多次字符串。