Zřetězení více řetězců (Průvodce jazykem C#)

Zřetězení je proces připojení jednoho řetězce na konec druhého řetězce. Zřetězení řetězců 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í pouze za běhu.

Poznámka:

Příklady jazyka C# v tomto článku se spouštějí v Try.NET inline code runner a playground. Vyberte tlačítko Spustit a 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 zřetězí 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ů nejsou k dispozici žádné náklady na výkon za běhu.

// 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);

+ a += operátory

Ke zřetězení řetězcových proměnných můžete použít + operátory nebo += operátory, interpolaci řetězců nebo String.Format, String.JoinString.Concatnebo 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í + a += operátorů 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šší zřetězení řetězců pomocí interpolace ř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.

Počínaje jazykem C# 10 můžete pomocí interpolace řetězců inicializovat konstantní řetězec, pokud jsou všechny výrazy používané pro zástupné symboly 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 StringBuilder třídy 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 výběru zřetězení řetězců nebo StringBuilder třídy si můžete přečíst více.

String.Concat nebo String.Join

Další možností spojení řetězců z kolekce je použití String.Concat metody. Použijte String.Join metodu, pokud oddělovač by měl oddělit zdrojové řetězce. 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 pro spojení řetězců z kolekce. Tato metoda kombinuje zdrojové řetězce pomocí výrazu lambda. Výraz lambda dělá práci přidat každý řetězec do existující akumulace. 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 přidělení než jiné metody pro zřetězení kolekcí, protože pro každou iteraci vytvoří zprostředkující řetězec. Pokud je optimalizace výkonu kritická, zvažte StringBuilder třídu neboString.Joinmetodu String.Concat zřetězení kolekce namísto Enumerable.Aggregate.

Viz také