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

时间:2011-04-07 13:30:48

标签: c# sorting

我有一系列数据:

!
A
B
E
$
N

我希望它可以从字母数字排序到非字母数字。

示例:A B E N ! $

我将如何完成这项工作?

4 个答案:

答案 0 :(得分:3)

char[] yourOriginalValues = new [] { '!', 'A', 'B', 'E', '$', 'N' };

IEnumerable<char> result = 
       yourOriginalValues.Where(c => Char.IsLetterOrDigit(c))
            .OrderBy(c => c)
            .Concat(yourOriginalValues.Where(c => !Char.IsLetterOrDigit(c)));

这似乎产生了你正在寻找的价值。

答案 1 :(得分:3)

这可以通过OrderByThenBy扩展方法的组合来实现:

char[] data = { 'E', 'B', '$', 'N', '!', 'A' };
var query = data.OrderByDescending(c => char.IsLetter(c))
                .ThenBy(c => c);

答案 2 :(得分: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;
    }
});
每次评论

添加:同样的事情,只有不同的语法(使用普通的命名方法):

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);

答案 3 :(得分:0)

myArray.Sort();

这将使用默认的,字母(非数字)排序。那应该有用还是我错过了什么?