Jak spojit více řetězců (Průvodce C#)
zřetězení je proces připojení jednoho řetězce na konec jiného řetězce. Propojíte řetězce pomocí operátoru +
. Pro řetězcové literály a řetězcové konstanty dochází ke zřetězení v době kompilace; nedojde ke zřetězení za běhu. U řetězcových proměnných dochází ke zřetězení výhradně za běhu programu.
Poznámka
Příklady jazyka C# v tomto článku se spouštějí v Try.NET integrovaném editoru kódu a prostředí pro experimentování. Výběrem tlačítka Spustit spusťte příklad v interaktivním okně. Jakmile kód spustíte, můžete ho upravit a spustit upravený kód tak, že znovu vyberete Spustit. Upravený kód se buď spustí v interaktivním okně, nebo pokud kompilace selže, zobrazí se v interaktivním okně všechny chybové zprávy kompilátoru jazyka C#.
Řetězcové literály
Následující příklad rozdělí dlouhý řetězcový literál na menší řetězce, aby se zlepšila čitelnost ve zdrojovém kódu. Kód poskládá menší řetězce a vytvoří dlouhý řetězcový literál. Části jsou zřetězeny do jednoho řetězce v době kompilace. Bez ohledu na počet zahrnutých řetězců neexistuje žádná ztráta výkonu za běhového času.
// 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);
operátory +
a +=
Ke zřetězení řetězcových proměnných můžete použít operátory +
nebo +=
, interpolaci řetězců nebo String.Format, String.Concat, String.Join nebo StringBuilder.Append metody. Operátor +
je snadno použitelný a umožňuje intuitivní kód. I když v jednom příkazu použijete několik operátorů +
, obsah řetězce se zkopíruje jenom jednou. Následující kód ukazuje příklady použití operátorů +
a +=
ke zřetězení řetězců:
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);
Interpolace řetězců
V některých výrazech je jednodušší použít interpolaci řetězců pro zřetězení řetězců, jak ukazuje následující kód:
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);
Poznámka
V operacích zřetězení řetězců kompilátor jazyka C# považuje řetězec null za stejný jako prázdný řetězec.
Interpolaci řetězců můžete použít k inicializaci konstantního řetězce, když všechny výrazy používané pro zástupné symboly jsou také konstantní řetězce.
String.Format
Další metodou zřetězení řetězců je String.Format. Tato metoda funguje dobře, když vytváříte řetězec z malého počtu řetězců součástí.
StringBuilder
V jiných případech můžete zkombinovat řetězce ve smyčce, kde nevíte, kolik zdrojových řetězců kombinujete, a skutečný počet zdrojových řetězců může být velký. Třída StringBuilder byla navržena pro tyto scénáře. Následující kód používá Append metodu třídy StringBuilder ke zřetězení řetězců.
// 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());
Další informace o důvodech pro výběr zřetězení řetězců nebo o třídě StringBuilder
.
String.Concat
nebo String.Join
Další možností spojení řetězců z kolekce je použití String.Concat metody. Pokud by oddělovač měl oddělit zdrojové řetězce, použijte String.Join metodu. Následující kód kombinuje pole slov pomocí obou metod:
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 a Enumerable.Aggregate
Nakonec můžete použít LINQ a metodu Enumerable.Aggregate ke spojení řetězců z kolekce. Tato metoda kombinuje zdrojové řetězce pomocí výrazu lambda. Lambda výraz slouží k přidávání každého řetězce k existující akumulaci. Následující příklad kombinuje pole slov a přidává mezeru mezi každým slovem v poli:
string[] words = { "The", "quick", "brown", "fox", "jumps", "over", "the", "lazy", "dog." };
var phrase = words.Aggregate((partialPhrase, word) =>$"{partialPhrase} {word}");
System.Console.WriteLine(phrase);
Tato možnost může způsobit více alokací než jiné metody zřetězení kolekcí, protože pro každou iteraci vytvoří mezikrokový řetězec. Pokud je optimalizace výkonu kritická, zvažte třídu StringBuilder
nebo metodu String.Concat
či String.Join
pro zřetězení kolekce namísto Enumerable.Aggregate
.