Culture agnostic string comparisons

Posted

Something I've seen a lot at different clients is naive string comparison. The most common case is to do something involving String.ToLower() on both strings that are being compared and then an equality comparison of the result.

This is not always the correct way of doing it, and especially not if you at some point in time want people who's using different culture settings than you to run your application. You can read more about this problem in this excellent blog post by Jeff Atwood.

What you should do is simply to use the overloads of the String.Equals method that takes a StringComparison, or use a StringComparer directly.

[Fact]
public void Test_String_Equality()
{
   // Given
   string first = "HELLO WORLD";
   string second = "hello world";

   // When
   bool result = first.Equals(second, StringComparison.OrdinalIgnoreCase);

   // Then
   Assert.True(result);
}

The StringComparer is also very valuable to use with collections when you need to do a lookup for a specific string (i.e. HashSet<string> or IDictionary<String, T>).

[Fact]
public void Test_String_Lookup()
{
   // Given
   var dictionary = new Dictionary<string, int>(StringComparer.OrdinalIgnoreCase);
   dictionary.Add("HELLO WORLD", 42);

   // When
   var result = dictionary.ContainsKey("hello world");

   // Then
   Assert.True(result);
}