C# Storleken på det okänsliga skiftläget innehåller strängkontroll

I den här handledningen lär vi oss olika sätt att göra case insensitive string contains check i C#

Det ser ut som ett enkelt problem, men standardmetoden C# string.Contains() är skiftlägeskänslig

Och om strängen inte är på engelska, dvs. för andra språk, kan vi inte jämföra text direkt med skiftlägeskänslig text

Båda strängarna bör vara i samma kultur och vi bör känna till språkkulturen.

Oftast kommer vi att jämföra strängar endast på engelska.

Metod 1: Användning av C# string.IndexOf() -metoden.

Vi kan använda C# string.IndexOf() -metoden för att kontrollera om en sträng innehåller tecken som är okänslig för stor- och småbokstäver.

IndexOf() metoden accepterar parametern StringComparison.OrdinalIgnoreCase, som anger vilken typ av sökning som ska användas för tecknen.


string textToCheck = "STRING Contains";
bool contains = textToCheck.IndexOf("string", StringComparison.OrdinalIgnoreCase) >= 0;

Metod 2: Användning av string.Contains() -metoden i .Net 5+ & .NET Core 2.0+

I de senaste versionerna av dot net, dvs. i .Net Core 2.0+ och .Net 5+. Metoden string.Contains() har en överladdad metod som tar emot parametern StringComparison.


string textToCheck = "STRING Contains";
bool checkContains = textToCheck.Contains("string",StringComparison.OrdinalIgnoreCase);

Metod 3: Användning av Regex.IsMatch() -metoden

Vi kan använda reguljära uttryck för att kontrollera om en sträng innehåller en storleksordning utan att ta hänsyn till storleken.

Om du är bekant med Regex, använd Regex.IsMatch() -metoden och för att kontrollera om det är okänsligt för stor bokstavsskillnader, använd RegexOptions.IgnoreCase -parametern

var stringToSearch = "hI hEllo";
var substring = "hello";
bool contains = Regex.IsMatch(stringToCheck, Regex.Escape(substring), RegexOptions.IgnoreCase);

//true

Metod 4: Använd .ToUpper() & .ToLower()

Om strängarna är på engelska och det inte är något problem med prestandan kan vi konvertera båda strängarna till samma bokstavsform och sedan kontrollera att strängen innehåller.


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 för andra språk

Skiftlägeskänslighet är språkberoende

På engelska är t.ex. I den stora bokstavsvarianten av i.

På det turkiska språket är den stora bokstavsversionen av i det okända tecknet İ.

För att göra en kontroll av strängar som inte tar hänsyn till storleken måste vi använda objektet 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

Jag har skapat CultureInfo objektet för turkiska språket. Och jämfört båda strängarna med hjälp av CompareInfo enligt nedan.

trCulture.CompareInfo.IndexOf(check, text, CompareOptions.IgnoreCase) >= 0;

Bästa sättet att göra en kontroll av strängar som inte är skiftlägeskänsliga innehåller strängar

Om du använder den senaste versionen av .Net kan du använda metoden string.Contains().

I annat fall använder du metoden string.IndexOf().

Föredra inte metoderna .ToUpper() eller To.Lower() eftersom de kan leda till prestandaproblem.

Använd CultureInfo objektet för strängar på andra språk.