C# ToLower Method Examples, Performance

ToLower changes strings to be all lowercase. It converts an entire string—without changing letters that are already lowercased or digits. It copies a string and returns a reference to the new string. The original string is unchanged.


Example. First here we call ToLower on a mixed-case or uppercase string and it will return a copied version that is all lowercase. Characters such as digits will not be modified. Only uppercase letters are changed.

C# program that uses ToLower

using System;

class Program
    static void Main()
	// Input string
	string mixedCase = "This is a MIXED case string.";

	// Call ToLower instance method, which returns a new copy.
	string lower = mixedCase.ToLower();

	// Display results
	Console.WriteLine("{0}, {1}",


This is a MIXED case string., this is a mixed case string.

The first string is declared and the instance method ToLower is called on it. That method returns a new string that is lowercase. The original string is not modified. The Console.WriteLine method is called with a format string.


Example 2. Next, we use CultureInfo with ToLower. I don't show any real-world globalization code here. I include this example because it has improved performance over the code in the first example, as we see in the benchmark later.

C# program that uses System.Globalization

using System;
using System.Globalization;

class Program
    static void Main()
	// Input string
	string upper = "UPPERCASE STRING";

	// Get current culture
	CultureInfo culture = CultureInfo.CurrentCulture;

	// Call ToLower instance method with globalization parameter
	string lower = upper.ToLower(culture);

	// Display result


uppercase string

You can see that after the first string is declared, we declare a new CultureInfo, which we acquire from the CurrentCulture property. Internally, this property fetches the current thread's globalization state.

Next: The program calls the ToLower instance method overload with one parameter.

Note: Internally, this method doesn't need to fetch the CurrentCulture because it already has it.

Performance. Here I tested the performance of ToLower versus the performance of ToLowerInvariant. I was surprised to find a big difference between the two methods, with ToLower being faster. I found that using an explicit CultureInfo was fastest.

Input variables used in benchmark: C#

string text = "This is an UPPER string.";
CultureInfo c = CultureInfo.CurrentCulture;

Statements tested in loops: C#
    Each line was in a separate loop.
    10000000 iterations.

string text2 = text.ToLower();

string text2 = text.ToLowerInvariant();

string text2 = text.ToLower(c);


ToLower():            1054 ms
ToLowerInvariant():   1724 ms
ToLower(CultureInfo):  884 ms [fastest]

When we get the CultureInfo of the CurrentCulture, we access a property that internally gets Thread.CurrentThread.CurrentCulture. We access per-thread data. This explains the speedup when declaring CultureInfo outside of the loop.


Tip: You can find more information about using globalizations when lowercasing strings by reading about the TextInfo class.


Tip 2: If a string is already lowercase, we can simply do nothing. We must first scan for validity.

IsUpper, IsLower

Summary. We used the ToLower method in the C# language targeting the .NET Framework, including both overloads. We also used ToLowerInvariant—this was much slower than the ToLower method. ToLower with no parameter was not the fastest.