当前位置:编程学习 > C#/ASP.NET >>

字符串asc码排序

                    string[] vv = { "1", "2", "A", "a", "B", "b" };
                    Array.Sort(vv);


排序之后是不是应该是1,2,A,B,a,b


可是排序之后是1,2,a,A,b,B

是知道是为什么 --------------------编程问答-------------------- 顶,谁来回答一下 --------------------编程问答-------------------- string 排序不仅仅是ascii码排序 --------------------编程问答-------------------- 刚发现,c#中字符串排序规则很奇葩。
A > a, A < B, A < b 
这让用惯c++的程序员情何以堪 --------------------编程问答-------------------- reflector string compareTo实现就清楚了 --------------------编程问答--------------------
引用 4 楼 hdt 的回复:
reflector string compareTo实现就清楚了


求教怎么反编译。我看不到实现,只能看到这样 


public int CompareTo(string strB)
{
}

 

 
--------------------编程问答-------------------- string aa = "A";
Console.WriteLine(aa.CompareTo("b")); // 结果-1

Console.WriteLine(aa.CompareTo("a"));//结果1

MSDN:
strA.compareTo(strB)
小于零
 此实例位于 strB 之前。 
 

 此实例在排序顺序中的位置与 strB 相同。 
 
大于零
 此实例位于 strB 之后。
 
--------------------编程问答-------------------- 官方说Sort属于不稳定排序 
此方法使用快速排序算法。 这实现执行一个不稳定的排序,也就是说,如果两个元素相等,则其顺序可能不被保留。 相反,保持一个稳定的排序的元素,平等秩序。 

从排序的结果来看 Sort排序是把大小写当成两个相等的元素了   所以排在一起 
你可以用string[] vv = { "A", "a", "B", "b","a","A"};
来验证下   顺序应该是a,a,A,A,b,B --------------------编程问答--------------------
string[] vv = { "1", "2", "A", "a", "B", "b" };
vv = vv.OrderBy(x => (int)x[0]).ToArray();
--------------------编程问答-------------------- 一个可行的方法: 用string.CompareOrdinal

          
  string[] vv = { "1", "2", "A", "a", "B", "b" };
            Array.Sort(vv, string.CompareOrdinal);
--------------------编程问答-------------------- 这个是对的
引用 9 楼 matrixcl 的回复:
一个可行的方法: 用string.CompareOrdinal

          C# code
  string[] vv = { "1", "2", "A", "a", "B", "b" };
            Array.Sort(vv, string.CompareOrdinal);
--------------------编程问答--------------------
引用 10 楼 icedmilk 的回复:
这个是对的

引用 9 楼 matrixcl 的回复:

一个可行的方法: 用string.CompareOrdinal

C# code
string[] vv = { "1", "2", "A", "a", "B", "b" };
Array.Sort(vv, string.CompareOrdinal);

恩,不错


private static unsafe int CompareOrdinalHelper(string strA, string strB)
        {
            int num = Math.Min(strA.Length, strB.Length);
            int num2 = -1;
            fixed (char* str = ((char*) strA))
            {
                char* chPtr = str;
                fixed (char* str2 = ((char*) strB))
                {
                    char* chPtr2 = str2;
                    char* chPtr3 = chPtr;
                    char* chPtr4 = chPtr2;
                    while (num >= 10)
                    {
                        if (*(((int*) chPtr3)) != *(((int*) chPtr4)))
                        {
                            num2 = 0;
                            break;
                        }
                        if (*(((int*) (chPtr3 + 2))) != *(((int*) (chPtr4 + 2))))
                        {
                            num2 = 2;
                            break;
                        }
                        if (*(((int*) (chPtr3 + 4))) != *(((int*) (chPtr4 + 4))))
                        {
                            num2 = 4;
                            break;
                        }
                        if (*(((int*) (chPtr3 + 6))) != *(((int*) (chPtr4 + 6))))
                        {
                            num2 = 6;
                            break;
                        }
                        if (*(((int*) (chPtr3 + 8))) != *(((int*) (chPtr4 + 8))))
                        {
                            num2 = 8;
                            break;
                        }
                        chPtr3 += 10;
                        chPtr4 += 10;
                        num -= 10;
                    }
                    if (num2 == -1)
                    {
                        goto Label_0101;
                    }
                    chPtr3 += num2;
                    chPtr4 += num2;
                    int num3 = chPtr3[0] - chPtr4[0];
                    if (num3 != 0)
                    {
                        return num3;
                    }
                    return (chPtr3[1] - chPtr4[1]);
                Label_00E7:
                    if (*(((int*) chPtr3)) != *(((int*) chPtr4)))
                    {
                        goto Label_0105;
                    }
                    chPtr3 += 2;
                    chPtr4 += 2;
                    num -= 2;
                Label_0101:
                    if (num > 0)
                    {
                        goto Label_00E7;
                    }
                Label_0105:
                    if (num > 0)
                    {
                        int num4 = chPtr3[0] - chPtr4[0];
                        if (num4 != 0)
                        {
                            return num4;
                        }
                        return (chPtr3[1] - chPtr4[1]);
                    }
                    return (strA.Length - strB.Length);
                }
            }
        }
--------------------编程问答--------------------
引用 9 楼 matrixcl 的回复:
一个可行的方法: 用string.CompareOrdinal

  

C# code
  string[] vv = { "1", "2", "A", "a", "B", "b" };
            Array.Sort(vv, string.CompareOrdinal);


//输出:1、2、A、B、a、b
补充:.NET技术 ,  C#
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,