近日在用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=1a_1=1a_1=1_1a_1_1=1b=2b_2=2b_2=2_2b_2_2=2Use Array.Sort<string>:a_1_1=1a_1=1a_1=1_1a=1b_2_2=2b_2=2b_2=2_2b=2Press any key to continue . . .
两种排序得到了截然不同的顺序。
观察起来,问题貌似出在“_”和“=”的比较上。
单独比较字符‘_’和‘=’,‘_’是大于‘=’的,也就是说,冒泡排序法排出来的顺序才是正确的。
难道是Array.Sort<T>有问题?期望高人帮忙解决。
