对字符串排序的影响 字符串的大小比较并不是如C那样按照字符串字符内码大小顺序从头到尾来比较的。由于我是从C/C转过来的我一直以来都以为.net 下字符串的比较规则和C是一样的直到有一天我的程序在英文操作系统下出错。.net 下字符串的排序受 System.Threading.Thread.CurrentThread.CurrentCulture 这个当前区域性信息影响不同的区域性信息字符串的排序结果会完全不同。比如简体中文操作系统的默认当前区域性信息为 zh-CN 而英文操作系统(美国销售的默认为 en-US 我们就来看看这两者对中文字符串的排序有什么不同先看 zh-CNspan stylecolor:#000000span stylebackground-color:#ffffffspan stylecolor:#000000span stylebackground-color:#f4f4f4 span stylecolor:#0000ffstring/span[] stringList { span stylecolor:#006080不/span, span stylecolor:#006080啊/span, span stylecolor:#006080从/span, span stylecolor:#006080的/span,span stylecolor:#006080一/span };/span/span/span/spanspan stylecolor:#000000span stylebackground-color:#ffffffspan stylecolor:#000000span stylebackground-color:#f4f4f4 System.Threading.Thread.CurrentThread.CurrentCulture span stylecolor:#0000ffnew/span System.Globalization.CultureInfo(span stylecolor:#006080zh-CN/span);/span/span/span/spanspan stylecolor:#000000span stylebackground-color:#ffffffspan stylecolor:#000000span stylebackground-color:#f4f4f4 Array.Sort(stringList);/span/span/span/spanspan stylecolor:#000000span stylebackground-color:#ffffffspan stylecolor:#000000span stylebackground-color:#f4f4f4 span stylecolor:#0000ffforeach/span (span stylecolor:#0000ffstring/span str span stylecolor:#0000ffin/span stringList)/span/span/span/span{span stylecolor:#000000span stylebackground-color:#ffffffspan stylecolor:#000000span stylebackground-color:#f4f4f4 Console.WriteLine(str);/span/span/span/span}输出结果为啊不从的一我们再看 en-USspan stylecolor:#000000span stylebackground-color:#ffffffspan stylecolor:#000000span stylebackground-color:#f4f4f4 span stylecolor:#0000ffstring/span[] stringList { span stylecolor:#006080不/span, span stylecolor:#006080啊/span, span stylecolor:#006080从/span, span stylecolor:#006080的/span,span stylecolor:#006080一/span };/span/span/span/spanspan stylecolor:#000000span stylebackground-color:#ffffffspan stylecolor:#000000span stylebackground-color:#f4f4f4 System.Threading.Thread.CurrentThread.CurrentCulture span stylecolor:#0000ffnew/span System.Globalization.CultureInfo(span stylecolor:#006080en-US/span);/span/span/span/spanspan stylecolor:#000000span stylebackground-color:#ffffffspan stylecolor:#000000span stylebackground-color:#f4f4f4 Array.Sort(stringList);/span/span/span/spanspan stylecolor:#000000span stylebackground-color:#ffffffspan stylecolor:#000000span stylebackground-color:#f4f4f4 span stylecolor:#0000ffforeach/span (span stylecolor:#0000ffstring/span str span stylecolor:#0000ffin/span stringList)/span/span/span/span{span stylecolor:#000000span stylebackground-color:#ffffffspan stylecolor:#000000span stylebackground-color:#f4f4f4 Console.WriteLine(str);/span/span/span/span}输出结果为一不从啊的我们可以看出不同的区域性信息上述字符串的排序结果完全不同简体中文下排序按照汉字的拼音顺序来排序而en-US 下则是按汉字的unicode 内码顺序排序。其实就是简体中文下排序顺序也有两种一种是拼音顺序一种是笔画顺序下面我们看看按笔画顺序排序的结果span stylecolor:#000000span stylebackground-color:#ffffffspan stylecolor:#000000span stylebackground-color:#f4f4f4 span stylecolor:#0000ffstring/span[] stringList { span stylecolor:#006080不/span, span stylecolor:#006080啊/span, span stylecolor:#006080从/span, span stylecolor:#006080的/span,span stylecolor:#006080一/span };/span/span/span/spanspan stylecolor:#000000span stylebackground-color:#ffffffspan stylecolor:#000000span stylebackground-color:#f4f4f4 System.Threading.Thread.CurrentThread.CurrentCulture span stylecolor:#0000ffnew/span System.Globalization.CultureInfo(span stylecolor:#006080zh-CN_stroke/span);/span/span/span/spanspan stylecolor:#000000span stylebackground-color:#ffffffspan stylecolor:#000000span stylebackground-color:#f4f4f4 Array.Sort(stringList);/span/span/span/spanspan stylecolor:#000000span stylebackground-color:#ffffffspan stylecolor:#000000span stylebackground-color:#f4f4f4 span stylecolor:#0000ffforeach/span (span stylecolor:#0000ffstring/span str span stylecolor:#0000ffin/span stringList)/span/span/span/span{span stylecolor:#000000span stylebackground-color:#ffffffspan stylecolor:#000000span stylebackground-color:#f4f4f4 Console.WriteLine(str);/span/span/span/span}输出结果为一不从的啊排序顺序对程序移植性的影响显而易见如果不注意这个问题当程序从中文操作系统移植到英文操作系统上运行时中文字符串的排序结果会完全不同如果这个排序结果仅仅用于显示则显示结果会不同如果排序结果被作为一种类似主键的方式存储在文件那么在中文操作系统下排序的文档到了英文操作系统下就变成了不排序的文档整个程序逻辑都会发生错误。为了防止这种情况发生我们必须在排序时指定一个固定的区域性信息而不是使用操作系统默认的区域性信息。二、对字符串查找的影响span stylecolor:#000000span stylebackground-color:#ffffff Listspan stylecolor:#0000ffstring/span list span stylecolor:#0000ffnew/span Listspan stylecolor:#0000ffstring/span(stringList); Console.WriteLine(list.BinarySearch(span stylecolor:#006080啊/span)); /span/span上面代码如果stringList 是从文件中读出而这个文件是在中文操作系统下生成如果当前是英文操作系统则这里二分法查找字符串的结果就不确定因为输入的字符串在英文操作系统下被认为不是排序的。三、对Indexof的影响这一节直接转载 MSDN 上的原文 http://msdn.microsoft.com/zh-cn/library/a7zyyk0c%28vVS.80%29.aspx您可以使用重载的 CompareInfo.IndexOf 方法返回指定字符串中某个字符或子字符串的从零开始的索引。如果在指定字符串中未找到该字符或子字符串此方法将返回一个负整数。在使用CompareInfo.IndexOf搜索指定字符时注意接受 CompareOptions 参数的方法重载执行比较的方式与不接受CompareOptions参数的方法重载不同。搜索char在 Visual Basic 中为Char并且不使用CompareOptions类型的参数的CompareInfo.IndexOf重载执行区分区域性的搜索。这就是说如果char是一个表示预先撰写的字符的 Unicode 值如连字“Æ”(\u00C6)则根据区域性的不同它可能被视为等效于它的以正确顺序排列的任何组成部分如“AE”(\u0041 \u0045)。若要执行序号不区分区域性搜索即两个char只有 Unicode 值相同时才被视为相等请使用带CompareOptions参数的CompareInfo.IndexOf重载之一。将CompareOptions参数设置为CompareOptions.Ordinal值。您也可以使用搜索char的 String.IndexOf 方法重载来执行序号搜索。请注意搜索字符串的String.IndexOf方法重载执行区分区域性的搜索。下面的代码示例阐释了根据区域性的不同CompareInfo.IndexOf(string, char)方法返回的结果的差异。针对“da-DK”丹麦的丹麦语创建CultureInfo。接下来使用CompareInfo.IndexOf方法的重载在字符串“Æble”和“aeble”中搜索字符“Æ”。请注意对于“da-DK”区域性带CompareOptions.Ordinal参数的CompareInfo.IndexOf方法与不带CompareOptions.Ordinal参数的CompareInfo.Index方法将返回相同的结果。字符“Æ”仅被视为等效于 Unicode 代码值 \u00E6。span stylecolor:#000000span stylebackground-color:#ffffffspan stylecolor:#000000span stylebackground-color:#f4f4f4span stylecolor:#0000ffusing/span System;/span/span/span/spanusingSystem.Globalization;span stylecolor:#000000span stylebackground-color:#ffffffspan stylecolor:#000000span stylebackground-color:#f4f4f4span stylecolor:#0000ffusing/span System.Threading;/span/span/span/spanspan stylecolor:#000000span stylebackground-color:#ffffffspan stylecolor:#000000span stylebackground-color:#f4f4f4span stylecolor:#0000ffpublic/span span stylecolor:#0000ffclass/span CompareClass/span/span/span/span{span stylecolor:#000000span stylebackground-color:#ffffffspan stylecolor:#000000span stylebackground-color:#f4f4f4 /span/span/span/spanpublicstaticvoidMain()span stylecolor:#000000span stylebackground-color:#ffffffspan stylecolor:#000000span stylebackground-color:#f4f4f4 {/span/span/span/spanstringstr1 Æble;span stylecolor:#000000span stylebackground-color:#ffffffspan stylecolor:#000000span stylebackground-color:#f4f4f4 span stylecolor:#0000ffstring/span str2 span stylecolor:#006080aeble/span; /span/span/span/spancharfind Æ;span stylecolor:#000000span stylebackground-color:#ffffffspan stylecolor:#000000span stylebackground-color:#f4f4f4 /span/span/span/span// Creates a CultureInfo for Danish in Denmark.span stylecolor:#000000span stylebackground-color:#ffffffspan stylecolor:#000000span stylebackground-color:#f4f4f4 CultureInfo ci span stylecolor:#0000ffnew/span CultureInfo(span stylecolor:#006080da-DK/span);/span/span/span/spanspan stylecolor:#000000span stylebackground-color:#ffffffspan stylecolor:#000000span stylebackground-color:#f4f4f4 span stylecolor:#0000ffint/span result1 ci.CompareInfo.IndexOf(str1, find);/span/span/span/spanintresult2 ci.CompareInfo.IndexOf(str2, find);span stylecolor:#000000span stylebackground-color:#ffffffspan stylecolor:#000000span stylebackground-color:#f4f4f4 span stylecolor:#0000ffint/span result3 ci.CompareInfo.IndexOf(str1, find, /span/span/span/spanCompareOptions.Ordinal);span stylecolor:#000000span stylebackground-color:#ffffffspan stylecolor:#000000span stylebackground-color:#f4f4f4 span stylecolor:#0000ffint/span result4 ci.CompareInfo.IndexOf(str2, find, /span/span/span/spanCompareOptions.Ordinal);span stylecolor:#000000span stylebackground-color:#ffffffspan stylecolor:#000000span stylebackground-color:#f4f4f4 /span/span/span/spanConsole.WriteLine(\nCultureInfo is set to {0} , ci.DisplayName);span stylecolor:#000000span stylebackground-color:#ffffffspan stylecolor:#000000span stylebackground-color:#f4f4f4 Console.WriteLine(span stylecolor:#006080\nUsing CompareInfo.IndexOf(string, char) /span/span/span/span/spanmethod\nthe result of searching for {0} in the string {1} is:span stylecolor:#000000span stylebackground-color:#ffffffspan stylecolor:#000000span stylebackground-color:#f4f4f4 {2}, find, str1, result1);/span/span/span/spanConsole.WriteLine(\nUsing CompareInfo.IndexOf(string, char)span stylecolor:#000000span stylebackground-color:#ffffffspan stylecolor:#000000span stylebackground-color:#f4f4f4 method\nthe result of searching for {0} in the string {1} is: /span/span/span/span{2}, find, str2, result2);span stylecolor:#000000span stylebackground-color:#ffffffspan stylecolor:#000000span stylebackground-color:#f4f4f4 Console.WriteLine(span stylecolor:#006080\nUsing CompareInfo.IndexOf(string, char, /span/span/span/span/spanCompareOptions) method\nthe result of searching for {0} in thespan stylecolor:#000000span stylebackground-color:#ffffffspan stylecolor:#000000span stylebackground-color:#f4f4f4 string {1} is: {2}, find, str1, result3);/span/span/span/spanConsole.WriteLine(\nUsing CompareInfo.IndexOf(string, char,span stylecolor:#000000span stylebackground-color:#ffffffspan stylecolor:#000000span stylebackground-color:#f4f4f4 CompareOptions) method\nthe result of searching for {0} in the /span/span/span/spanstring {1} is: {2}, find, str2, result4);span stylecolor:#000000span stylebackground-color:#ffffffspan stylecolor:#000000span stylebackground-color:#f4f4f4 }/span/span/span/span}