Come concatenare più stringhe (Guida di C#)

La concatenazione è il processo di aggiunta di una stringa alla fine di un'altra stringa. Le stringhe vengono concatenate usando l'operatore +. Per i valori letterali e le costanti di stringa, la concatenazione viene eseguita in fase di compilazione; non viene eseguita alcuna concatenazione in fase di esecuzione. Per le variabili di stringa, la concatenazione viene eseguita solo in fase di esecuzione.

Nota

Gli esempi in C# in questo articolo vengono eseguiti nello strumento di esecuzione e playground per codice inline Try.NET. Selezionare il pulsante Esegui per eseguire un esempio in una finestra interattiva. Dopo aver eseguito il codice, è possibile modificarlo ed eseguire il codice modificato selezionando di nuovo Esegui. Il codice modificato viene eseguito nella finestra interattiva o, se la compilazione non riesce, la finestra interattiva visualizza tutti i messaggi di errore del compilatore C#.

Valori letterali di stringa

Nell'esempio seguente un valore letterale stringa lungo viene suddiviso in stringhe di dimensioni inferiori per migliorare la leggibilità nel codice sorgente. Il codice concatena le stringhe più piccole per creare il valore letterale stringa lunga. Le parti sono concatenate in una singola stringa in fase di compilazione. Non c'è alcun impatto sulle prestazioni in fase di esecuzione, indipendentemente dal numero di stringhe coinvolte.

// Concatenation of literals is performed at compile time, not run time.
string text = "Historically, the world of data and the world of objects " +
"have not been well integrated. Programmers work in C# or Visual Basic " +
"and also in SQL or XQuery. On the one side are concepts such as classes, " +
"objects, fields, inheritance, and .NET Framework APIs. On the other side " +
"are tables, columns, rows, nodes, and separate languages for dealing with " +
"them. Data types often require translation between the two worlds; there are " +
"different standard functions. Because the object world has no notion of query, a " +
"query can only be represented as a string without compile-time type checking or " +
"IntelliSense support in the IDE. Transferring data from SQL tables or XML trees to " +
"objects in memory is often tedious and error-prone.";

System.Console.WriteLine(text);

Operatori + e +=

Per concatenare le variabili di stringa, è possibile usare gli operatori + o +=, l'interpolazione di stringa oppure i metodi String.Format, String.Concat, String.Join o StringBuilder.Append. L'operatore + è facile da usare e rende il codice intuitivo. Anche se si usano diversi operatori + in un'unica istruzione, il contenuto della stringa viene copiato una sola volta. Il codice seguente mostra esempi dell'uso degli operatori + e += per concatenare le stringhe:

string userName = "<Type your name here>";
string dateString = DateTime.Today.ToShortDateString();

// Use the + and += operators for one-time concatenations.
string str = "Hello " + userName + ". Today is " + dateString + ".";
System.Console.WriteLine(str);

str += " How are you today?";
System.Console.WriteLine(str);

Interpolazione di stringa

In alcune espressioni risulta più semplice concatenare le stringhe usando l'interpolazione di stringhe, come illustrato nel codice seguente:

string userName = "<Type your name here>";
string date = DateTime.Today.ToShortDateString();

// Use string interpolation to concatenate strings.
string str = $"Hello {userName}. Today is {date}.";
System.Console.WriteLine(str);

str = $"{str} How are you today?";
System.Console.WriteLine(str);

Nota

Nelle operazioni di concatenazione di stringhe il compilatore C# tratta una stringa Null come se fosse una stringa vuota.

A partire da C# 10, è possibile usare l'interpolazione di stringhe per inizializzare una stringa costante quando anche tutte le espressioni usate per i segnaposto sono stringhe costanti.

String.Format

Un altro metodo per concatenare le stringhe è String.Format. Tale metodo è utile quando si compila una stringa da un numero ridotto di stringhe dei componenti.

StringBuilder

In altri casi è possibile combinare le stringhe in un ciclo, se non si conosce il numero di stringhe di origine da combinare e il numero effettivo di stringhe di origine potrebbe essere elevato. La classe StringBuilder è stata progettata per questi scenari. Il codice seguente usa il metodo Append della classe StringBuilder per concatenare le stringhe.

// Use StringBuilder for concatenation in tight loops.
var sb = new System.Text.StringBuilder();
for (int i = 0; i < 20; i++)
{
    sb.AppendLine(i.ToString());
}
System.Console.WriteLine(sb.ToString());

Per altre informazioni, vedere le ragioni per cui scegliere la concatenazione di stringhe o la classe StringBuilder.

String.Concat oppure String.Join

Un'altra opzione per unire le stringhe di una raccolta consiste nell'usare il metodo String.Concat. Utilizzare il String.Join metodo se un delimitatore deve separare le stringhe di origine. Il codice seguente combina una matrice di parole con entrambi i metodi:

string[] words = { "The", "quick", "brown", "fox", "jumps", "over", "the", "lazy", "dog." };

var unreadablePhrase = string.Concat(words);
System.Console.WriteLine(unreadablePhrase);

var readablePhrase = string.Join(" ", words);
System.Console.WriteLine(readablePhrase);

LINQ e Enumerable.Aggregate

Infine, è possibile usare LINQ e il metodo Enumerable.Aggregate per unire le stringhe di una raccolta. Questo metodo combina le stringhe di origine usando un'espressione lambda. L'espressione lambda esegue le operazioni necessarie per aggiungere ogni stringa all'accumulo esistente. L'esempio seguente combina una matrice di parole, aggiungendo uno spazio tra ogni parola nella matrice:

string[] words = { "The", "quick", "brown", "fox", "jumps", "over", "the", "lazy", "dog." };

var phrase = words.Aggregate((partialPhrase, word) =>$"{partialPhrase} {word}");
System.Console.WriteLine(phrase);

Tale opzione può causare più allocazioni rispetto ad altri metodi per la concatenazione delle raccolte, in quanto crea una stringa intermedia per ogni iterazione. Se l'ottimizzazione delle prestazioni è fondamentale, considerare la classeStringBuilder o il metodo String.Concat o String.Join per concatenare una raccolta in luogo di Enumerable.Aggregate.

Vedi anche