czwartek, 2 kwietnia 2020

Najlepszy sposób jak porównywać ze sobą stringi w c# sharpie?

Porównywanie (stringów) ciągów znaków w c#? Przecież to takie proste. Otóż nie. Sharp to bardzo bogaty język i daje nam duże pole do popisu. Trzeba znać różnice między
- "test" == "test"
- "test".Equals("test")
- "test".CompareTo("test")
- string.CompareOrdinal("testA", "testB")
== VS .Euqals Operator == porównuje ze sobą referencję stringów natomiast CompareTo porównuje zawartość. Warto to zapamiętać. Jeśli mamy taki przypadek:
 object s1 = "test"; // string
 object values = {‘t’, ‘e’, ‘s’, ‘t’}; // tablica char’ów
to przyrównując do siebie
 s1 == values // zwróci FALSE, ponieważ referencje nie wskazują na to samo miejsce w pamięci

 s1.Equals(values) // zwróci TRUE, gdyż porównamy wyłącznie zawartość
CompareTo służy do określania czy dany string jest większy, mniejszy lub równy w stosunku do innego stringa. Możliwe rezultaty:
 0 = stringi są takie same
 -1 = string A jest mniejszy od B
 1 = string A jest większy od B
Natomiast CompareOrdinal działa podobnie jak CompareTo, lecz porównuje jakby na podstawie wartości liczbowych charów w ciągu i jego wynikiem jest właśnie ta różnica. Bardzo prosto to wytłumaczyć przez prosty przykład
 string.CompareOrdinal("a", "a"); // zwróci 0 ponieważ nie ma tutaj żadnej różnicy
 string.CompareOrdinal("a", "b"); // zwróci -1 ponieważ różnica tutaj jest o jeden jeśli patrząc na tablice wartości znaków (ASCII)
 string.CompareOrdinal("a", "c"); // zwróci -2
‘a’ ma wartość 97 ‘b’ ma wartość 98 jeśli odejmiemy a od b = otrzymamy -1 Więc czego powinnismy używać do porównywania? W 99% przypadkach wystarczy użyć operatora ==, lecz jeśli zależy nam na porownaniu wartości to warto korzystać z "test".Equals("test".ToCharArray()) tyle jeśli chodzi o porównywanie stringów w csharp :)