2010-09-04 224 views
5

我需要将<string,string>的集合转换为包含集合中所有值的单个字符串,例如KeyValueKeyValue ...但是,如何有效地执行此操作?将集合转换为字符串的最佳方式

我已经这样做了它的那一刻:

parameters = string.Join("", requestParameters.Select(x => string.Concat(x.Key, x.Value))); 

但不知道它是做的最好的方式,将一个字符串生成器,不是更好吗?我猜这个集合最多会包含10对。

+1

你的方式看起来非常漂亮和紧凑。 – tidwall 2010-09-04 19:48:58

回答

4

有了这样一个小集合,没有太多的性能问题,但我可能只是使用StringBuilder来追加所有的值。

像这样:

var sb = new Text.StringBuilder; 
foreach (var item in requestParameters) 
{ 
    sb.AppendFormat("{0}{1}", item.Key, item.Value); 
} 
var parameters = sb.ToString(); 
+1

但是这只是重复'string.Join'在内部做的事情(OP似乎在.NET 4.0上,所以他有权访问接受'IEnumerable '的超载)。 – 2010-09-04 20:15:58

0

字符串生成器会很好。使用append将每个字符串添加到字符串构建器。

基本上,为什么concat,replace,join,string + string等被认为不是最好的唯一原因,因为它们都倾向于破坏当前字符串&重新创建一个新字符串。

所以,当你添加字符串像10-12次时,这实际上意味着你会破坏&很多次重新创建一个字符串。

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已经为你写的东西。

相关问题