====== Łańcuchy, czyli napisy ======
===== =====
Łańcuchy zawierają sekwencję znaków \\ ''"Witaj Świecie"''
Typ ''string''
string tekst = "Witaj Świecie"
Łańcuch jest typem referencyjnym (jest aliasem klasy ''[[https://learn.microsoft.com/en-us/dotnet/api/system.string?view=net-6.0|System.String]]'')
char [] litery= { 'H', 'e', 'l', 'l','o' };
string tekst = new string(litery);
Tablice łańcuchów
string [] tekst = {"Ala", "ma", "kota"};
===== Łączenie łańcuchów =====
"Dodawanie" łańcuchów (konkatenacja) to łączenie napisów
string tekst = "Witaj";
tekst = tekst + " Świecie";
tekst += " Hura!";
Uwaga: wynikiem operacji jest nowy łańcuch.
===== Dostęp do znaków =====
Znaki łańcucha dostępne za pomocą operatora ''[index]'' \\ Pierwszy element ma indeks 0 (to jest tablica znaków) \\
string tekst = "kod";
tekst[2] = 't';
===== Klasa string =====
Zobacz: [[https://learn.microsoft.com/en-us/dotnet/api/system.string?view=netcore-3.1|String]]
^ Metody i własności ^ Opis ^ Przykład ^
| ''Chars[]'' | indeksowane elementy łańcucha | ''tekst[0] '' |
| ''Length'' | długość łańcucha | ''tekst.Length '' |
| ''Equals()'' | czy napisy takie same? | ''tekst.Equals("Hello")'' |
| ''Compare()'' | kolejność alfabetyczna (-1, 0 , 1) | ''tekst.Compare("Hello")'' |
===== =====
| ''Contains()'' | czy zawiera łańcuch? | ''tekst.Contains("kot")'' |
| ''StartsWith()'', ''EndsWith()'' | czy zaczyna się/kończy się od? | ''tekst.StartsWith("Ala") '' |
| ''IndexOf()'' | indeks początku pasującego wzorca | ''tekst.IndexOf("Ala")'' |
| ''PadLeft()'', ''PadRight()'' | uzupełnia napis spacjami do zadanej długości | ''tekst.PadLeft(25) '' |
===== =====
| ''Remove()'' | usuwa ciąg znaków od zadanej pozycji | ''tekst.Remove(2,5) '' |
| ''Substring()'' | wyodrębnia ciąg znaków od zadanej pozycji | ''tekst.Substring(2,5) '' |
| ''Replace()'' | zamienia fragment łańcucha | ''tekst.Replace("Ala", "Ewa") '' |
| ''ToLower()'', ''ToUpper()'' | zamienia litery na małe/wielkie | ''tekst.ToUpper() '' |
| ''Trim()'', TrimEnd()'', TrimStart()'' | usuwa znaki (spacje) z łańcucha | ''tekst.TrimEnd()'' |
===== =====
| ''Split()'' | dzieli łańcuch względem separatora | ''tekst.Split(' ') '' |
| ''Join()'' | łaczy tablicę napisów | ''String.Join(separator, tablica)''
===== Ćwiczenie =====
Napisz program, który wczytuje kolejne linie tekstu z konsoli aż do napotkania pustej linii.
Każda kolejna linia tekstu wypisywana jest w odwrotnej kolejności a wszystki małe litery zamieniane są na wielkie.
Przykład:
Ala ma kota
ATOK AM ALA
===== Ćwiczenie =====
Napisz program, który wczytuje kolejne linie tekstu z konsoli aż do napotkania pustej linii.
Po zakończeniu wczytywania tekstu program wypisuje wszystkie wyrazy podanego tekstu w porządku alfabetycznym.
Zakładamy, że wyrazy oddzielone są spacjami.
Przykład:
Ala ma kota.
Ala
kota.
ma
===== Klasa StringBuilder =====
* używanie łączenia łańcuchów może byc nieefektywne, bo za kazdym razem wynikiem jest kopia łancucha
* do budowania dłuższych napisów lepiej użyć ''[[https://learn.microsoft.com/en-us/dotnet/api/system.text.stringbuilder?view=net-6.0|System.StringBuilder()]]''
StringBuilder sb = new StringBuilder();
// Dodaj łańcuch na końcu
sb.Append("Witaj");
// Dodaj linię na końcu
sb.AppendLine("Świecie !");
// Dodaj formatowany napis
sb.AppendFormat("PI = {0:F5}", Math.PI);
// Ile znaków ?
Console.WriteLine("sb.Length={0}", sb.Length);
// Uzyskaj gotowy łańcuch
string tekst = sb.ToString();
Console.WriteLine(tekst);
===== Ćwiczenie - Porównanie szybkości StringBuildera =====
Napisz program, który porówna szybkość wykonywania operacji łączenia tekstu pomiędzy operatorem dodawania (''+'') i klasą ''StringBuilder()''.
W tym celu zbuduj napis składającyc się w wielu powtórzeń (np. 10 tysiecy) napisu ''"Witaj Świecie"'' i wyznacz czas wykoanania algorytmu dla obu porównywanych metod.
Do wyznaczenia casu wykonania programu można wykorzystać własność ''[[https://learn.microsoft.com/en-us/dotnet/api/system.datetime.now?view=net-6.0|System.DateTime.Now]], która zwraca aktualny czas z dokładnością do milisekund. Ta wartość może zostać wywołana do pomiaru czasu przed i po wykonaniu algorytmu. Przedział czasu między dwoma pomiarami czasu jest strukturą typu typu [[https://learn.microsoft.com/en-us/dotnet/api/system.timespan?view=net-6.0|TimeSpan]]. Struktura ta udostepnia własność [[https://learn.microsoft.com/en-us/dotnet/api/system.timespan.totalmilliseconds?view=net-6.0|TimeSpan.TotalMilliseconds]] zwracającą całkowitą liczbę milisekund pomiedzy pomiarami czasu.