将集合转换为字符串的最佳方式
我需要将<string,string>
的集合转换为包含集合中所有值的单个字符串,例如KeyValueKeyValue ...但是,如何有效地执行此操作?将集合转换为字符串的最佳方式
我已经这样做了它的那一刻:
parameters = string.Join("", requestParameters.Select(x => string.Concat(x.Key, x.Value)));
但不知道它是做的最好的方式,将一个字符串生成器,不是更好吗?我猜这个集合最多会包含10对。
有了这样一个小集合,没有太多的性能问题,但我可能只是使用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
字符串生成器会很好。使用append将每个字符串添加到字符串构建器。
基本上,为什么concat,replace,join,string + string等被认为不是最好的唯一原因,因为它们都倾向于破坏当前字符串&重新创建一个新字符串。
所以,当你添加字符串像10-12次时,这实际上意味着你会破坏&很多次重新创建一个字符串。
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已经为你写的东西。
你的方式看起来非常漂亮和紧凑。 – tidwall 2010-09-04 19:48:58