当前位置:编程学习 > 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

     --------------------编程问答-------------------- ABC本来就比abc大。大写字母排在后面。
msdn什么地方写“Outputs: ABC is less than abc”的。 --------------------编程问答--------------------
引用 1 楼  的回复:
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#
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,