2010-09-04 9 views
5

Ich muss eine Sammlung von <string,string> in eine einzelne Zeichenfolge mit allen Werten in der Sammlung wie KeyValueKeyValue konvertieren ... Aber wie mache ich das effektiv?beste Möglichkeit zum Konvertieren von Sammlung in String

Ich habe es auf diese Weise im Moment getan:

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

aber nicht sicher, ist es der beste Weg, es zu tun, sei ein String-Builder besser wäre? Ich denke, die Sammlung wird maximal 10 Paare enthalten.

+1

Ihr Weg sieht sehr schön und kompakt aus. – tidwall

Antwort

4

Mit so einer kleinen Sammlung gibt es nicht viel Leistung, aber ich würde wahrscheinlich nur einen StringBuilder verwenden, um alle Werte anzuhängen.

So:

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

Aber das ist nur duplizieren, was 'string.Join' intern tut (das OP scheint auf .NET 4.0 zu sein, also hat er Zugriff auf die Überladung, die ein' IEnumerable 'akzeptiert). –

0

String Builder wäre in Ordnung. Verwenden Sie anhängen, um dem Zeichenfolgengenerator jeweils eine Zeichenfolge hinzuzufügen.

Im Grunde der einzige Grund, warum concat, ersetzen, join, string + string, etc. nicht als die besten gelten, weil sie alle dazu neigen, die aktuelle Zeichenfolge zu zerstören & erstellen Sie eine neue.

Also, wenn Sie Zeichenfolgen wie bis zu 10-12 Mal hinzufügen, bedeutet es wirklich, dass Sie & eine Zeichenfolge erstellen, die oft wiederholen.

5

string.Join nicht wirklich die beste Option verwendet, da es nur string[] oder object[] Parameter akzeptiert, zu verlangen, dass alle select -Stil Abfragen benötigten vollständig ausgewertet und zunächst in ein Array gesetzt werden .

4.0 mit sich brachte .NET an overload that accepts IEnumerable<string> - das ist, was Sie verwenden - und sogar an overload that accepts any IEnumerable<T>. Dies sind definitiv Ihre beste Wette, da sie jetzt Teil der BCL sind.

übrigens Aufreißen die Quelle für die erste Überlast in Reflector zeigt Code, der ziemlich dicht an what davisoa suggested folgt:

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(); 
    } 
} 

Also mit anderen Worten, wenn Sie diesen Code ändern, sind Sie ein StringBuilder zu verwenden, schreib einfach was MS für dich geschrieben hat.

Verwandte Themen