public static void Main()
var allValidNonControlUnicodeCharacters = Enumerable.Range(char.MinValue, char.MaxValue)
.Where(x => !char.IsSurrogate(x))
.Where(x => !char.IsControl(x))
var nonLowercasingForInvariant = allValidNonControlUnicodeCharacters
.Where(char.IsLetterOrDigit)
.Select(x => x.ToString())
.Where(x => !x.ToLowerInvariant().Equals(x, StringComparison.InvariantCultureIgnoreCase))
Console.WriteLine($"Number of chars that don't compare invariant: {nonLowercasingForInvariant.Length}");
Console.WriteLine(string.Join(", ", nonLowercasingForInvariant));
var nonLowercasingForOrdinal = allValidNonControlUnicodeCharacters
.Where(char.IsLetterOrDigit)
.Select(x => x.ToString())
.Where(x => !x.ToLowerInvariant().Equals(x, StringComparison.OrdinalIgnoreCase))
Console.WriteLine($"Number of chars that don't compare ordinal: {nonLowercasingForOrdinal.Length}");
Console.WriteLine(string.Join(", ", nonLowercasingForOrdinal));
var nonUppercasingForInvariant = allValidNonControlUnicodeCharacters
.Where(char.IsLetterOrDigit)
.Select(x => x.ToString())
.Where(x => !x.ToUpperInvariant().Equals(x, StringComparison.InvariantCultureIgnoreCase))
Console.WriteLine($"Number of chars that don't compare invariant: {nonUppercasingForInvariant.Length}");
Console.WriteLine(string.Join(", ", nonUppercasingForInvariant));
var nonUppercasingForOrdinal = allValidNonControlUnicodeCharacters
.Where(char.IsLetterOrDigit)
.Select(x => x.ToString())
.Where(x => !x.ToUpperInvariant().Equals(x, StringComparison.OrdinalIgnoreCase))
Console.WriteLine($"Number of chars that don't compare ordinal: {nonUppercasingForOrdinal.Length}");
Console.WriteLine(string.Join(", ", nonUppercasingForOrdinal));
var numberOfUniqueLowercase = allValidNonControlUnicodeCharacters
.Where(char.IsLetterOrDigit)
.Select(x => x.ToString())
.Select(x => x.ToLowerInvariant())
Console.WriteLine($"Number of lowercase groups: {numberOfUniqueLowercase}");
var numberOfUniqueSimpleLowercase = allValidNonControlUnicodeCharacters
.Where(char.IsLetterOrDigit)
.Select(x => x.ToString())
.Select(x => x.ToLower())
Console.WriteLine($"Number of simple lowercase groups: {numberOfUniqueSimpleLowercase}");
var numberOfUniqueUppercase = allValidNonControlUnicodeCharacters
.Where(char.IsLetterOrDigit)
.Select(x => x.ToString())
.Select(x => x.ToUpperInvariant())
Console.WriteLine($"Number of uppercase groups: {numberOfUniqueUppercase}");
var numberOfUniqueSimpleUppercase = allValidNonControlUnicodeCharacters
.Where(char.IsLetterOrDigit)
.Select(x => x.ToString())
.Select(x => x.ToUpper())
Console.WriteLine($"Number of simple uppercase groups: {numberOfUniqueSimpleUppercase}");