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 :)
3 komentarze:
Super artykuł, dzięki
_____________________________
https://www.aptusshop.pl/sklepy-internetowe-wroclaw.php
Ruby on rails to ciekawe sformułowanie. Pierwszy raz słyszę..
Przydatny artykuł - ostatnio ten temat mnie nurtował, ale już teraz znam rozwiązanie.
Dzięki.
Prześlij komentarz