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

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

Uwaga

Przykłady języka C# w tym artykule są uruchamiane 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 pozycję Uruchom ponownie. 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 ciągu

Poniższy przykład dzieli długi literał ciągu na mniejsze ciągi, aby zwiększyć czytelność kodu źródłowego. Kod łączy mniejsze ciągi w celu utworzenia literału długiego 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 ciągó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ć zmienne ciągu, można użyć + operatorów lub += interpolacjiciągów lub String.Formatmetod , String.Concatlub String.JoinStringBuilder.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);

Uwaga

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

Począwszy od języka C# 10, można użyć interpolacji ciągów, aby 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żesz łą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 została zaprojektowana StringBuilder dla tych scenariuszy. Poniższy kod używa Append metody StringBuilder klasy 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());

Możesz dowiedzieć się więcej o przyczynach wyboru łączenia ciągów lub StringBuilder klasy.

String.Concat lub String.Join

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

Na koniec można użyć LINQ i Enumerable.Aggregate metody, aby połączyć ciągi z kolekcji. Ta metoda łączy ciągi źródłowe przy użyciu wyrażenia lambda. Wyrażenie lambda wykonuje pracę, aby dodać każdy ciąg do istniejącej akumulowania. 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 jest krytyczna, należy rozważyć StringBuilder klasę lub String.JoinString.Concat metodę łączenia kolekcji, zamiast .Enumerable.Aggregate

Zobacz też