字符串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实现就清楚了 --------------------编程问答--------------------
求教怎么反编译。我看不到实现,只能看到这样
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" };--------------------编程问答-------------------- 一个可行的方法: 用string.CompareOrdinal
vv = vv.OrderBy(x => (int)x[0]).ToArray();
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);
}
}
}
//输出:1、2、A、B、a、b
补充:.NET技术 , C#