using System.Collections.Generic;
public static void Main()
Console.WriteLine("Demo LexicographicToAlphaNumeric Sorting:");
var tests = new string [] {
foreach(var x in tests.Select(x => new { Value=x, SortKey = LexicographicToAlphaNumeric(x)}).OrderBy(x => x.SortKey))
Console.WriteLine("{0} ({1})", x.Value.PadRight(15), x.SortKey);
Console.WriteLine("Demo longer numberics");
Console.WriteLine( LexicographicToAlphaNumeric("Bird 10000",7));
Console.WriteLine( LexicographicToAlphaNumeric("Bird 2000",7));
Console.WriteLine( LexicographicToAlphaNumeric("Bird 1000",7));
public static string LexicographicToAlphaNumeric(string value, int size = 3)
if (String.IsNullOrWhiteSpace(value)) return value;
bool isNumberGroup = false;
return String.Join("", value.Select((c, index) => {
var isNumber = Char.IsDigit(c);
if( isNumber != isNumberGroup)
isNumberGroup = isNumber;
return new { c, isNumber, groupId, index };
.Select(g => g.First().isNumber ? new string(g.Select(x => x.c).ToArray()).PadLeft(size, '0') : new string(g.Select(x => x.c).ToArray())));