VS2008中C#比较字符串与MSDN标准结果相反
// Enter different values for string1 and string2 to// experiement with behavior of CompareTo
string string1 = "ABC";
string string2 = "abc";
int result = string1.CompareTo(string2);
if (result > 0)
{
System.Console.WriteLine("{0} is greater than {1}", string1, string2);
}
else if (result == 0)
{
System.Console.WriteLine("{0} is equal to {1}", string1, string2);
}
else if (result < 0)
{
System.Console.WriteLine("{0} is less than {1}", string1, string2);
}
// Outputs: ABC is less than abc
这是个VS2008 MSDN中的源代码,编译调试后显示“ABC is greater than abc” ,
但是msdn上明确指出 Outputs: ABC is less than abc
--------------------编程问答-------------------- ABC本来就比abc大。大写字母排在后面。
msdn什么地方写“Outputs: ABC is less than abc”的。 --------------------编程问答--------------------
MSDN确实有文章是这么写的,出现错误也不是这一处了,早前就有网友问过我这种类似的问题,
并且,我们发现MSDN涉及统一问题有正确与错误两种版本同时存在 --------------------编程问答-------------------- 楼主所见的是这篇文章,我认为此处是错误的:
http://msdn.microsoft.com/zh-cn/library/c84eby0h(v=VS.90).aspx
请楼主参见MSDN这篇文章中第一段代码示例:
http://msdn.microsoft.com/zh-cn/library/35f0x18w(v=VS.90).aspx --------------------编程问答-------------------- 其实这种非此即彼的问题有错误,还是比较容易发现和纠正的,
有些被收录的关于OOAD和OOP的文章持有的是错误的观点(或者是被错误翻译的),误导不少开发人员,
给我印象最深刻的莫过于N年前那篇关于把数据集转换成class的文章了
--------------------编程问答-------------------- 就在那个错的msdn文章代码的上方,还有这么一句话
字符串对象还有 CompareTo() 方法,用于根据一个字符串是小于 (<) 还是大于 (>) 另一个字符串来返回一个整数值。比较字符串时使用的是 Unicode 值,并且小写的值小于大写的值。
这说的就是对的。 --------------------编程问答-------------------- 因为CompareTo是有地域性和比较规则的。
msdn上明确指出小写字符的unicode值大于大写字母。这句话是正确的。
但是我们默认调用的CompareTo,并非比较的unicode值,而是作为字符来比较。使用字符排序规则。
这样以来小写字母自然在前了。
我们可以通过重写比较器,来指定地域性和排序规则就可以按照unicode值来比较了。
namespace TestCShar
{
class Program
{
static void Main(string[] args)
{
string a = "ABC";
string b = "abc";
int x = a.CompareTo(b);//x=1
//Ordinal即规定按照unicode来比较
MyStringComparer mc = new MyStringComparer(CompareInfo.GetCompareInfo("en-US"), CompareOptions.Ordinal);
int y = mc.Compare(a, b);//y=-32
}
}
public class MyStringComparer : IComparer
{
private CompareInfo myComp;
private CompareOptions myOptions = CompareOptions.None;//默认按照字符串比较
public MyStringComparer()
{
myComp = CompareInfo.GetCompareInfo("en-US");
}
public MyStringComparer(CompareInfo cmpi, CompareOptions options)
{
this.myComp = cmpi;
this.myOptions = options;
}
public int Compare(object x, object y)
{
if (x == y) return 0;
if (x == null) return -1;
if (y == null) return 1;
String sa = x as String;
String sb = y as String;
if (sa != null && sb != null)
return myComp.Compare(sa, sb, myOptions);
throw new ArgumentException("x and y should be strings.");
}
}
}
更多关于CompareOptions的内容可以参见MSDN:http://msdn.microsoft.com/zh-cn/library/system.globalization.compareoptions(v=vs.90).aspx
MSDN中关于String.CompareTo()方法的描述可能确实有一些问题。
补充:.NET技术 , C#