Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从字母数字到非字母数字的排序_C#_Sorting - Fatal编程技术网

C# 从字母数字到非字母数字的排序

C# 从字母数字到非字母数字的排序,c#,sorting,C#,Sorting,我有一组数据: ! A B E $ N 我想把它从字母数字到非字母数字排序 例如:aben$ 我将如何着手实现这一点 myArray.Sort(); 这将使用默认的字母(非数字)排序。这应该行得通,还是我遗漏了什么?char[]yourOriginalValues=new[]{'!'、'A'、'B'、'E'、'$'、'N'; char[] yourOriginalValues = new [] { '!', 'A', 'B', 'E', '$', 'N' }; IEnumerable<

我有一组数据:

!
A
B
E
$
N
我想把它从字母数字到非字母数字排序

例如:
aben$

我将如何着手实现这一点

myArray.Sort();
这将使用默认的字母(非数字)排序。这应该行得通,还是我遗漏了什么?

char[]yourOriginalValues=new[]{'!'、'A'、'B'、'E'、'$'、'N';
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)));
IEnumerable结果= yourOriginalValues.Where(c=>Char.IsleterOrdigit(c)) .OrderBy(c=>c) .Concat(yourOriginalValues.Where(c=>!Char.isleterordigit(c));

这似乎会产生您想要的值。

如果您想要定制排序顺序,您需要提供自己的比较功能。在您的情况下(先是字母+数字,后是其他数字),您可以使用

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;
    }
});
var data=“!ABE$N”.ToCharArray().ToList();
数据排序((x,y)=>{
如果(x==y)返回0;
if(字符Isleterordigit(x))
{
if(!Char.isleterordigit(y))返回-1;
返回x
为每条注释添加了:相同的内容,只是语法不同(使用普通的旧命名方法):

int MyComparisonFunction(字符x,字符y)
{
如果(x==y)返回0;
if(字符Isleterordigit(x))
{
if(!Char.isleterordigit(y))返回-1;
返回x
在另一种风格中,同样的事情是创建一个实现并使用它。如果排序顺序应在更多位置使用,这将非常有用。许多集合和控件提供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);
公共类AlphaccPriorTononalPhabeticComparer:IComparer
{
公共整数比较(字符x,字符y)
{
如果(x==y)返回0;
if(字符Isleterordigit(x))
{
if(!Char.isleterordigit(y))返回-1;
返回x
这可以通过和扩展方法的组合来实现:

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

myArray.Sort();将非字母数字字符放在前面,因此不是我想要的。请注意,这将使非字母字符保持原始顺序,例如
!ABE$N
$ABE!N
将有不同的结果(
ABEN!$
ABEN$!
)。这可能是您想要的,也可能不是您想要的。最后一个问题是,我正在使用WinUltraGrid,如何将其添加到这样的排序中?对不起,但我完全不知道;我从未使用过WinUltraGrid,甚至从未听说过它。只要问一个新问题,其他人可能会帮助你。@Wesley,注意@Mormegil的评论是正确的。如果希望非alpha非数字字符按特定顺序排序,请在:yourOriginalValues之后添加OrderBy。其中(c=>!Char.IsleterOrdigit(c)),整个构造是一个匿名函数,为排序提供了一个
x
y
只是比较的参数(在您的例子中,比较的值是两个字符),就像任何其他方法的参数一样,仅在本例中使用。我将添加另一个语法来澄清。很漂亮!我能够将此权利添加到我的ICompare for UltraGrid中。你太棒了!
char[] data = { 'E', 'B', '$', 'N', '!', 'A' };
var query = data.OrderByDescending(c => char.IsLetter(c))
                .ThenBy(c => c);