Udostępnij za pośrednictwem


Jak połączyć wiele ciągów (Przewodnik języka C#)

Concatenation to proces dołączania jednego ciągu na koniec innego ciągu. Ciągi można łączyć przy użyciu operatora +. W przypadku literałów tekstowych i stałych tekstowych, łączenie odbywa się w czasie kompilacji; nie występuje łączenie w czasie wykonywania. W przypadku zmiennych typu string, łączenie odbywa się tylko w czasie wykonywania.

Notatka

Przykłady języka C# w tym artykule działają w Try.NET wbudowanym modułem uruchamiającym kod i placem zabaw. Wybierz przycisk Uruchom, aby uruchomić przykład w oknie interaktywnym. Po wykonaniu kodu można go zmodyfikować i uruchomić zmodyfikowany kod, wybierając ponownie Uruchom. Zmodyfikowany kod jest uruchamiany w oknie interaktywnym lub, jeśli kompilacja zakończy się niepowodzeniem, w oknie interaktywnym zostaną wyświetlone wszystkie komunikaty o błędach kompilatora języka C#.

Literały tekstowe

Poniższy przykład dzieli długi literał ciągu na mniejsze ciągi, aby poprawić czytelność kodu źródłowego. Kod łączy mniejsze ciągi, aby utworzyć długi literał ciągu. Części są łączone w jeden ciąg w czasie kompilacji. Nie ma kosztów wydajności w czasie wykonywania niezależnie od liczby zaangażowanych łańcuchów znaków.

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

Operatory + i +=

Aby połączyć ciągi zmiennych, można użyć operatorów + lub +=, interpolacji ciągów znaków lub metod String.Format, String.Concat, String.Join lub StringBuilder.Append. Operator + jest łatwy w użyciu i umożliwia intuicyjne używanie kodu. Nawet jeśli używasz kilku operatorów + w jednej instrukcji, zawartość ciągu jest kopiowana tylko raz. Poniższy kod przedstawia przykłady użycia operatorów + i += do łączenia ciągów:

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

Interpolacja ciągów

W niektórych wyrażeniach łatwiej jest połączyć ciągi przy użyciu interpolacji ciągów, jak pokazano w poniższym kodzie:

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

Notatka

W operacjach łączenia ciągów kompilator języka C# traktuje ciąg o wartości null tak samo jak pusty ciąg.

Za pomocą interpolacji ciągów można zainicjować ciąg stały, gdy wszystkie wyrażenia używane dla symboli zastępczych są również ciągami stałymi.

String.Format

Inną metodą łączenia ciągów jest String.Format. Ta metoda działa dobrze podczas tworzenia ciągu z niewielkiej liczby ciągów składników.

StringBuilder

W innych przypadkach można łączyć ciągi w pętli, w której nie wiadomo, ile ciągów źródłowych łączysz, a rzeczywista liczba ciągów źródłowych może być duża. Klasa StringBuilder została zaprojektowana dla tych scenariuszy. Poniższy kod używa metody Append klasy StringBuilder do łączenia ciągów.

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

Więcej informacji na temat powodów, dla których warto wybrać łączenie ciągów, lub klasy StringBuilder.

String.Concat lub String.Join

Inną opcją łączenia ciągów z kolekcji jest użycie metody String.Concat. Użyj metody String.Join, jeśli ogranicznik powinien oddzielić ciągi źródłowe. Poniższy kod łączy tablicę wyrazów za pomocą obu 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 i Enumerable.Aggregate

W końcu można użyć LINQ i metody Enumerable.Aggregate do łączenia ciągów z kolekcji. Ta metoda łączy ciągi źródłowe przy użyciu wyrażenia lambda. Wyrażenie lambda służy do dodania każdego ciągu do istniejącej akumulacji. Poniższy przykład łączy tablicę wyrazów, dodając spację między poszczególnymi wyrazami w tablicy:

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

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

Ta opcja może spowodować więcej alokacji niż inne metody łączenia kolekcji, ponieważ tworzy ciąg pośredni dla każdej iteracji. Jeśli optymalizacja wydajności ma kluczowe znaczenie, rozważ klasę StringBuilder lub metodę String.Concat lub String.Join, aby połączyć kolekcję, zamiast Enumerable.Aggregate.

Zobacz też