Using ToLower() or ToUpper() in C# to compare strings is not safe in all cultures

If you’re using Resharper, Roslynator or similar you’ll likely see string comparisons using ToLower() or ToUpper() flagged.

Why are these C# string compare methods flagged?

Well these string comparisons are not safe in all cultures. The canonical example is the ‘Turkish i problem‘ which relates to how in Turkish the dot is present on the top of the uppercase version of ‘i’ and there is no dot on the lowercase version of the ‘i’. This means using .ToLower() etc. may return different results on machines with different culture settings.

On their Best practices for comparing strings in .NET page Microsoft recommends using StringComparison.Ordinal or StringComparison.OrdinalIgnoreCase for comparisons as your safe default for culture-agnostic string matching.

StringCompare example in C#

Aside from giving us a way to do a safe string compare, StringComparison also expresses intent more clearly and does not need to create strings so there’s a potential performance boost too.