My suggestion would be to write a custom Comparer
.The comparer could split off both the word prefix and the numeric suffix part of the KitCode. Then it could use string.Compare
to compare the prefixes and use CompareTo
to compare the numeric suffixes.
class KitCodeComparer : IComparer<string>
{
public int Compare(string x, string y)
{
char[] digits = new char[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };
int intpos = x.IndexOfAny(digits);
string wordPrefixX = intpos == -1 ? x : x.Substring(0, intpos);
int numericSuffixX = intpos == -1 ? intpos : int.Parse(x.Substring(intpos));
intpos = y.IndexOfAny(digits);
string wordPrefixY = intpos == -1 ? y : y.Substring(0, intpos);
int numericSuffixY = intpos == -1 ? intpos : int.Parse(y.Substring(intpos));
int result = string.Compare(wordPrefixX, wordPrefixY);
if(result==0)
{
result = numericSuffixX.CompareTo(numericSuffixY);
}
return result;
}
}
The comparer can be used like this.
List<string> testStrings = new List<string>()
{
"BIN","CAN9","CAN8","CAN10","CAN11","CAN12"
};
testStrings.Sort(new KitCodeComparer());
testStrings.ForEach(s => Console.WriteLine(s));