近日在用Array.Sort<string>方法对字符串数组进行排序时遇到了一个郁闷的问题。
Array.Sort<T>要求T应该事先IComparable<T>接口,而观察System.String类的定义,的确也实现了这个接口。看来不应该有什么问题。但请看下面的代码:
using
System;

namespace
ConsoleApplication1

...
{
class Program

...{
static void BubbleSort(string[] array)

...{
int i, j; //交换标志
string temp;
bool exchange;

for (i = 0; i < array.Length; i++) //最多做R.Length-1趟排序

...{
exchange = false; //本趟排序开始前,交换标志应为假

for (j = array.Length - 2; j >= i; j--)

...{
if (System.String.CompareOrdinal(array[j + 1], array[j]) < 0) //交换条件

...{
temp = array[j + 1];
array[j + 1] = array[j];
array[j] = temp;

exchange = true; //发生了交换,故将交换标志置为真
}
}

if (!exchange) //本趟排序未发生交换,提前终止算法

...{
break;
}

}
}

static void showStrings(string[] ss)

...{
for (int i = 0; i < ss.Length; i++)
Console.WriteLine(ss[i]);
}

static void Main(string[] args)

...{
string[] ss1 =

...{
"a=1",
"b=2",
"a_1=1",
"b_2=2",
"a_1_1=1",
"b_2_2=2",
"a_1=1_1",
"b_2=2_2"
};

string[] ss2 =

...{
"a=1",
"b=2",
"a_1=1",
"b_2=2",
"a_1_1=1",
"b_2_2=2",
"a_1=1_1",
"b_2=2_2"
};

BubbleSort(ss1);
Console.WriteLine("Use BubbleSort:");
showStrings(ss1);

Array.Sort<string>(ss2);
Console.WriteLine("Use Array.Sort<string>:");
showStrings(ss2);
}
}
}
其中 BubbleSort 是我自己写的一个简单的冒泡排序法。运行这段代码,得到的结果如下:
Use BubbleSort:
a=1
a_1=1
a_1=1_1
a_1_1=1
b=2
b_2=2
b_2=2_2
b_2_2=2
Use Array.Sort<string>:
a_1_1=1
a_1=1
a_1=1_1
a=1
b_2_2=2
b_2=2
b_2=2_2
b=2
Press any key to continue . . .
两种排序得到了截然不同的顺序。
观察起来,问题貌似出在“_”和“=”的比较上。
单独比较字符‘_’和‘=’,‘_’是大于‘=’的,也就是说,冒泡排序法排出来的顺序才是正确的。
难道是Array.Sort<T>有问题?期望高人帮忙解决。