2015-05-07 12 views
5

Sono passato in rassegna la documentazione per la classe string e non ho visto alcun valido strumento per combinare un numero arbitrario di stringhe in una singola stringa. La procedura di meglio che ho potuto venire con nel mio programma èModo corretto in C# per combinare un numero arbitrario di stringhe in una singola stringa

string [] assetUrlPieces = { Server.MapPath("~/assets/"), 
          "organizationName/", 
          "categoryName/", 
          (Guid.NewGuid().ToString() + "/"), 
          (Path.GetFileNameWithoutExtension(file.FileName) + "/") 
          }; 

string assetUrl = combinedString(assetUrlPieces); 

private string combinedString (string [] pieces) 
{ 
    string alltogether = ""; 
    foreach (string thispiece in pieces) alltogether += alltogether + thispiece; 
    return alltogether; 
} 

ma che sembra troppo codice e troppa inefficienza (l'aggiunta stringa) e imbarazzo.

+0

Controlla ['string.Concat'] (https://msdn.microsoft.com/en-us/library/0wkb0y3w (v = vs.110) .aspx) – juharr

risposta

4

Si desidera un StringBuilder, penso.

var sb = new StringBuilder(pieces.Count()); 
foreach(var s in pieces) { 
    sb.Append(s); 
} 
return sb.ToString(); 

Aggiornamento

@ FiredFromAmazon.com: Penso che si vorrà andare con la soluzione string.Concat offerto da altri per

  1. sua pura semplicità
  2. Prestazioni più elevate. Sotto il cofano, utilizza FillStringChecked, che fa le copie del puntatore, mentre string.Join utilizza StringBuilder. Vedi http://referencesource.microsoft.com/#mscorlib/system/string.cs,1512. (Grazie a @Bas).
+0

Questo è il modo in cui' string.Join' è implementato, tuttavia è ottimizzato se conosce in anticipo il numero di stringhe per calcolare la lunghezza del buffer, http://referencesource.microsoft.com/#mscorlib/system/string.cs,06d13c9cb8b83f5d. Non serve a reimplementarlo. – Bas

+0

@Bas: grazie, costruzione aggiornata di StringBuilder con il conteggio delle stringhe nell'array delle parti per mostrare l'uso della lunghezza del buffer come da osservazione. – DWright

+0

@ FiredFromAmazon.com vedere il mio aggiornamento sopra sull'uso di string.Concat – DWright

15

Io preferisco usare string.Join:

var result = string.Join("", pieces); 

Si può leggere su string.Joinon MSDN

+0

Questo è il modo più semplice e veloce per farlo. Nitpick: usa 'string.Empty' forse. – Bas

+4

@Bas: non del tutto. String.Concat ... –

+0

Nota a margine: questo (insieme a 'StringBuilder' e' String.Concat' per un piccolo numero di stringhe) è il modo giusto per combinare più stringhe quando sono solo testo. Per i casi url/path è preferibile usare 'Uri',' UriBuilder', 'Path' types ... –

17

Se si vuole inserire un separatore tra i valori, string.Join è tuo amico. Se solo desidera concatenare le stringhe, quindi è possibile utilizzare string.Concat:

string assetUrl = string.Concat(assetUrlPieces); 

Questo è marginalmente più semplice (e forse più efficiente, ma probabilmente insignificante) di chiamare string.Join con un separatore vuoto.

Come notato nei commenti, se siete in realtà costruire l'array nello stesso punto nel codice che si fa la concatenazione, e non hanno bisogno l'array per altri scopi, basta usare la concatenazione direttamente:

string assetUrl = Server.MapPath("~/assets/") + 
    "organizationName/" + 
    "categoryName/" + 
    Guid.NewGuid() + "/" + 
    Path.GetFileNameWithoutExtension(file.FileName) + "/"; 

... o potenzialmente utilizzare string.Format.

+0

Alcuni Jon Skeet hanno suggerito di usare solo plus invece di costruire array e iterare su di esso:) http://stackoverflow.com/questions/10341188/string-concatenation-using-operator poiché è compilato in 'String.Concat' comunque ... –

+0

@AlexeiLevenkov: Vero, ma presumo che negli OP * situazione reale *, la matrice viene da altrove ... –

2

string.Concat è il metodo più appropriato per quello che vuoi.

var result = string.Concat(pieces); 

A meno che non si desidera mettere i delimitatori tra le singole stringhe.Allora devi usare string.Join

var result = string.Join(",", pieces); // comma delimited result. 
0

Un modo semplice per fare questo con un normale ciclo for: (dato che è possibile utilizzare gli indici, più mi piacciono questi cicli meglio di loop foreach)

private string combinedString(string[] pieces) 
    { 
    string alltogether = ""; 
    for (int index = 0; index <= pieces.Length - 1; index++) { 
     if (index != pieces.Length - 1) { 
      alltogether += string.Format("{0}/" pieces[index]); 
     } 
    } 
    return alltogether;