当前位置:编程学习 > C#/ASP.NET >>

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

     --------------------编程问答-------------------- 如果你确保没有看错MSDN的话,那可能就是MSDN写错了,毕竟MSDN也是人写的,写的时候张冠李戴也是有可能的。
比如以前做选择题,想好是选C的,结果却添了个D,这种可能也存在的。

--------------------编程问答-------------------- 回复 dalmeeme:

谢谢你的回复,msdn上明确指出小写字符的unicode值大于大写字母。
对于这个我是知道的。

也就是说 VS2008编译出来的结果是错误的,不知道有 遇到过这个错误么 --------------------编程问答--------------------
引用 2 楼  的回复:

以对此问题回复:
http://topic.csdn.net/u/20121007/18/45b927bc-c1f8-4a8d-ad92-d8258f095388.html?17567

注意:为了自己和别人方便,以后不要重复发帖 --------------------编程问答-------------------- 因为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
补充:.NET技术 ,  C#
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,