2010-09-04 223 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已經爲你寫的東西。

相關問題