using System.Collections.Generic;
using System.Threading.Tasks;
public static void Main()
var tagObjs = new List<TagObj>(new[]
Console.WriteLine("Before:");
tagObjs.ForEach(t => Console.WriteLine("\t" + t.Tag));
tagObjs.Sort(new TagObjComparer());
Console.WriteLine("\n\nAfter:");
tagObjs.ForEach(t => Console.WriteLine("\t" + t.Tag));
public TagObj(string tag)
public override string ToString()
public class TagObjComparer : IComparer<TagObj>
public int Compare(TagObj x, TagObj y)
return GetValue(x.Tag).CompareTo(GetValue(y.Tag));
private int GetValue(string str)
if (string.IsNullOrEmpty(str))
if (!char.IsLetter(str[0]))
int basenum = char.ToUpper(str[0]) - 'A' * 10000;
if (!int.TryParse(str.Substring(1), out result))