using System.Text.RegularExpressions;
using System.Collections.Generic;
static string SplitRegex(string x)
return Regex.Split(x, "([0-9]+)")[1];
private static int CompareContractNumbers(string x, string y)
int leftconvertresult = 0;
int rightconvertresult = 0;
bool leftcanconvertflag = Int32.TryParse(x, out leftconvertresult);
bool rightcanconvertflag = Int32.TryParse(y, out rightconvertresult);
if (leftcanconvertflag && !rightcanconvertflag)
if (!leftcanconvertflag && rightcanconvertflag)
if (leftcanconvertflag && rightcanconvertflag)
if (leftconvertresult > rightconvertresult)
if (leftconvertresult == rightconvertresult)
if (leftconvertresult < rightconvertresult)
if (!leftcanconvertflag && !rightcanconvertflag)
compareresult = CompareString(x, y);
private static int CompareString(string x, string y)
var pairs = x.Zip(y, (a, b) => new
foreach (var pair in pairs)
int value = pair.x.CompareTo(pair.y);
return y.Length.CompareTo(x.Length);
public static void Main()
var list = new List<string>{"12065", "10000-a", "10000", "10000b", "544fa", "a"};
list.Sort((x, y) => CompareContractNumbers(SplitRegex(x), SplitRegex(y)));
foreach (var item in list)