Если вы хотите иметь индивидуальный порядок сортировки, вам нужно предоставить собственную функцию сравнения. В вашем случае (буквы + цифры сначала, остальные позже) вы можете использовать что-то вроде
var data = "!ABE$N".ToCharArray().ToList();
data.Sort((x, y) => {
if (x == y) return 0;
if (Char.IsLetterOrDigit(x))
{
if (!Char.IsLetterOrDigit(y)) return -1;
return x < y ? -1 : +1;
}
else
{
if (Char.IsLetterOrDigit(y)) return +1;
return x < y ? -1 : +1;
}
});
Добавлено за комментарий: то же самое, только с другим синтаксисом (с использованием простого старого метода):
int MyComparisonFunction(char x, char y)
{
if (x == y) return 0;
if (Char.IsLetterOrDigit(x))
{
if (!Char.IsLetterOrDigit(y)) return -1;
return x < y ? -1 : +1;
}
else
{
if (Char.IsLetterOrDigit(y)) return +1;
return x < y ? -1 : +1;
}
}
// ...
var data = "!ABE$N".ToCharArray().ToList();
data.Sort(MyComparisonFunction);
То же самое в другом стиле - создать реализацию IComparer и использовать ее. Это полезно, если порядок сортировки следует использовать в большем количестве мест, во многих коллекциях и элементах управления есть свойство IComparer для переопределения порядка сортировки:
public class AlphabeticPriorToNonalphabeticComparer : IComparer<char>
{
public int Compare(char x, char y)
{
if (x == y) return 0;
if (Char.IsLetterOrDigit(x))
{
if (!Char.IsLetterOrDigit(y)) return -1;
return x < y ? -1 : +1;
}
else
{
if (Char.IsLetterOrDigit(y)) return +1;
return x < y ? -1 : +1;
}
}
}
// ...
var data = "!ABE$N".ToCharArray().ToList();
var myComparer = new AlphabeticPriorToNonalphabeticComparer();
data.Sort(myComparer);