string.ToLower() and string.ToLowerInvariant()

C#.NetString

C# Problem Overview


What's the difference and when to use what? What's the risk if I always use ToLower() and what's the risk if I always use ToLowerInvariant()?

C# Solutions


Solution 1 - C#

Depending on the current culture, ToLower might produce a culture specific lowercase letter, that you aren't expecting. Such as producing ınfo without the dot on the i instead of info and thus mucking up string comparisons. For that reason, ToLowerInvariant should be used on any non-language-specific data. When you might have user input that might be in their native language/character-set, would generally be the only time you use ToLower.

See this question for an example of this issue: https://stackoverflow.com/q/6600954/84206

Solution 2 - C#

TL;DR:

When working with "content" (e.g. articles, posts, comments, names, places, etc.) use ToLower(). When working with "literals" (e.g. command line arguments, custom grammars, strings that should be enums, etc.) use ToLowerInvariant().

Examples:

=Using ToLowerInvariant incorrectly=

In Turkish, DIŞ means "outside" and diş means "tooth". The proper lower casing of DIŞ is dış. So, if you use ToLowerInvariant incorrectly you may have typos in Turkey.

=Using ToLower incorrectly=

Now pretend you are writing an SQL parser. Somewhere you will have code that looks like:

if(operator.ToLower() == "like")
{
  // Handle an SQL LIKE operator
}

The SQL grammar does not change when you change cultures. A Frenchman does not write SÉLECTIONNEZ x DE books instead of SELECT X FROM books. However, in order for the above code to work, a Turkish person would need to write SELECT x FROM books WHERE Author LİKE '%Adams%' (note the dot above the capital i, almost impossible to see). This would be quite frustrating for your Turkish user.

Solution 3 - C#

I think this can be useful:

http://msdn.microsoft.com/en-us/library/system.string.tolowerinvariant.aspx

update

> If your application depends on the case of a string changing in a predictable way that is unaffected by the current culture, use the ToLowerInvariant method. The ToLowerInvariant method is equivalent to ToLower(CultureInfo.InvariantCulture). The method is recommended when a collection of strings must appear in a predictable order in a user interface control.

also

> ...ToLower is very similar in most places to ToLowerInvariant. The documents indicate that these methods will only change behavior with Turkish cultures. Also, on Windows systems, the file system is case-insensitive, which further limits its use...

http://www.dotnetperls.com/tolowerinvariant-toupperinvariant

hth

Solution 4 - C#

String.ToLower() uses the default culture while String.ToLowerInvariant() uses the invariant culture. So you are essentially asking the differences between invariant culture and ordinal string comparision.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionLouis RhysView Question on Stackoverflow
Solution 1 - C#AaronLSView Answer on Stackoverflow
Solution 2 - C#PaceView Answer on Stackoverflow
Solution 3 - C#danyolgiaxView Answer on Stackoverflow
Solution 4 - C#Cheng ChenView Answer on Stackoverflow