C# Case insensitive Contains string check
W tym tutorialu uczymy się różnych sposobów, aby zrobić case insensitive string contains check w C#
Wygląda to na prosty problem, ale domyślna metoda C# string.Contains()
jest wrażliwa na wielkość liter
A jeśli ciąg nie jest w języku angielskim, tzn. dla innych języków, nie możemy porównać tekstu z rozróżnianiem wielkości liter bezpośrednio
Oba ciągi powinny być w tej samej kulturze i powinniśmy znać kulturę języka.
W większości przypadków będziemy porównywać ciągi tylko w języku angielskim.
Metoda 1: Użycie metody C# string.IndexOf()
.
Możemy użyć metody C# string.IndexOf()
, aby sprawdzić czy łańcuch zawiera wielkość liter.
IndexOf()
metoda przyjmuje parametr StringComparison.OrdinalIgnoreCase
, który określa typ wyszukiwania znaków.
string textToCheck = "STRING Contains";
bool contains = textToCheck.IndexOf("string", StringComparison.OrdinalIgnoreCase) >= 0;
Metoda 2: Używanie metody string.Contains()
w .Net 5+ & .NET Core 2.0+
W najnowszych wersjach dot net, czyli w .Net Core 2.0+ i .Net 5+. Metoda string.Contains()
posiada przeciążoną metodę, która akceptuje parametr StringComparison
.
string textToCheck = "STRING Contains";
bool checkContains = textToCheck.Contains("string",StringComparison.OrdinalIgnoreCase);
Metoda 3: Użycie metody Regex.IsMatch()
Możemy użyć wyrażeń regularnych, aby wykonać niewrażliwe na wielkość liter sprawdzenie contains string.
Jeśli jesteś zaznajomiony z Regex
, użyj metody Regex.IsMatch()
i aby sprawdzić niewrażliwość na wielkość liter przekaż parametr RegexOptions.IgnoreCase
var stringToSearch = "hI hEllo";
var substring = "hello";
bool contains = Regex.IsMatch(stringToCheck, Regex.Escape(substring), RegexOptions.IgnoreCase);
//true
Metoda 4: Użycie .ToUpper()
& .ToLower()
Jeśli łańcuchy są w języku angielskim i wydajność nie jest problemem, możemy przekonwertować oba łańcuchy na ten sam przypadek, a następnie wykonać sprawdzenie string contains.
var stringToSearch = "hI hEllo";
var substring = "hello";
bool contains = stringToSearch.ToLower().Contains(substring.ToLower());
or
bool contains = stringToSearch.ToUpper().Contains(substring.ToUpper());
//true
C# Case insensitive Contains check dla innych języków
Niewrażliwość na wielkość liter jest zależna od języka
Na przykład, w języku angielskim I
jest wielką literą wersji i
.
Natomiast w języku tureckim duża litera wersji i
to nieznany znak İ
.
Aby wykonać sprawdzenie łańcucha bez uwzględniania wielkości liter musimy użyć obiektu CultureInfo
.
var text = "İ";
var check = "i";
CultureInfo trCulture = new CultureInfo("tr-TR",false);
bool englishContains = text.IndexOf(check, StringComparison.OrdinalIgnoreCase) >= 0;
//false
var turkishContains = trCulture.CompareInfo.IndexOf(check, text, CompareOptions.IgnoreCase) >= 0;
//true
Stworzyłem obiekt CultureInfo
dla języka tureckiego. I porównałem oba ciągi za pomocą CompareInfo
, jak pokazano poniżej.
trCulture.CompareInfo.IndexOf(check, text, CompareOptions.IgnoreCase) >= 0;
Najlepszy sposób, aby zrobić Case insensitive Contains string check
Jeśli używasz najnowszej wersji .Net
użyj metody string.Contains()
.
W przeciwnym razie trzymaj się metody string.IndexOf()
.
Nie preferuj metody .ToUpper()
lub To.Lower()
, ponieważ mogą one prowadzić do problemów z wydajnością.
Użyj obiektu CultureInfo
dla ciągów w innych językach.