从字母数字到非字母数字排序

Wes*_*son 5 c# sorting

我有一个数据数组:

!
A
B
E
$
N
Run Code Online (Sandbox Code Playgroud)

我希望它从字母数字到非字母数字排序.

例: A B E N ! $

我将如何实现这一目标?

Mor*_*gil 1

如果想要自定义排序顺序,则需要提供自己的比较函数。在你的情况下(首先是字母+数字,其余的稍后),你可以使用类似的东西

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;
    }
});
Run Code Online (Sandbox Code Playgroud)

添加每个评论:同样的事情,只是使用不同的语法(使用普通的旧命名方法):

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);
Run Code Online (Sandbox Code Playgroud)

另一种风格中的相同内容是创建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);
Run Code Online (Sandbox Code Playgroud)