字符串asc码排序

symbol_bc 2011-09-14 06:58:34
string[] vv = { "1", "2", "A", "a", "B", "b" };
Array.Sort(vv);


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


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

是知道是为什么
...全文
481 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
诺维斯基 2011-09-15
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 matrixcl 的回复:]
一个可行的方法: 用string.CompareOrdinal



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

//输出:1、2、A、B、a、b
风骑士之怒 2011-09-14
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 icedmilk 的回复:]
这个是对的

引用 9 楼 matrixcl 的回复:

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

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


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);
}
}
}
Icedmilk 2011-09-14
  • 打赏
  • 举报
回复
这个是对的
[Quote=引用 9 楼 matrixcl 的回复:]

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

C# code
string[] vv = { "1", "2", "A", "a", "B", "b" };
Array.Sort(vv, string.CompareOrdinal);
[/Quote]
matrixcl 2011-09-14
  • 打赏
  • 举报
回复
一个可行的方法: 用string.CompareOrdinal

  string[] vv = { "1", "2", "A", "a", "B", "b" };
Array.Sort(vv, string.CompareOrdinal);
threenewbee 2011-09-14
  • 打赏
  • 举报
回复
string[] vv = { "1", "2", "A", "a", "B", "b" };
vv = vv.OrderBy(x => (int)x[0]).ToArray();
sanjiawan 2011-09-14
  • 打赏
  • 举报
回复
官方说Sort属于不稳定排序
此方法使用快速排序算法。 这实现执行一个不稳定的排序,也就是说,如果两个元素相等,则其顺序可能不被保留。 相反,保持一个稳定的排序的元素,平等秩序。

从排序的结果来看 Sort排序是把大小写当成两个相等的元素了 所以排在一起
你可以用string[] vv = { "A", "a", "B", "b","a","A"};
来验证下 顺序应该是a,a,A,A,b,B
monkeyHere 2011-09-14
  • 打赏
  • 举报
回复
string aa = "A";
Console.WriteLine(aa.CompareTo("b")); // 结果-1

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

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


此实例在排序顺序中的位置与 strB 相同。

大于零
此实例位于 strB 之后。

matrixcl 2011-09-14
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 hdt 的回复:]

reflector string compareTo实现就清楚了
[/Quote]

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


public int CompareTo(string strB)
{
}




真相重于对错 2011-09-14
  • 打赏
  • 举报
回复
reflector string compareTo实现就清楚了
matrixcl 2011-09-14
  • 打赏
  • 举报
回复
刚发现,c#中字符串排序规则很奇葩。
A > a, A < B, A < b
这让用惯c++的程序员情何以堪
真相重于对错 2011-09-14
  • 打赏
  • 举报
回复
string 排序不仅仅是ascii码排序
symbol_bc 2011-09-14
  • 打赏
  • 举报
回复
顶,谁来回答一下

111,097

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧