[C#]简单重写IComparer接口,实现自己的String.CompareTo 方法,自定义比较规则。

在项目中经常会用到字符串比较,但是有时候对字符串的操作比较多,规则各异。

比如有的地方我们需要用排序规则,有的地方需要忽略大小写,我们该如何写一个比较容易操作的比较方法呢?

重新实现IComparer接口不失为一个好办法。

我们可以在实现Compare方法的时候指定比较规则CompareOptions

成员名称 说明
IgnoreCase 指示字符串比较必须忽略大小写。 
IgnoreKanaType 指示字符串比较必须忽略 Kana 类型。假名类型是指日语平假名和片假名字符,它们表示日语中的语音。平假名用于表示日语自有的短语和字词,而片假名用于表示从其他语言借用的字词,如“computer”或“Internet”。语音既可以用平假名也可以用片假名表示。如果选择该值,则认为一个语音的平假名字符等于同一语音的片假名字符。 
IgnoreNonSpace 指示字符串比较必须忽略不占空间的组合字符,比如音调符号。Unicode 标准将组合字符定义为与基字符组合起来产生新字符的字符。不占空间的组合字符在呈现时其本身不占用空间位置。有关不占空间的组合字符的更多信息,请参见 http://www.unicode.org 中的“The Unicode Standard”(Unicode 标准)。 
IgnoreSymbols 指示字符串比较必须忽略符号,如空白字符、标点符号、货币符号、百分号、数学符号、“&”符等等。 
IgnoreWidth 指示字符串比较必须忽略字符宽度。例如,日语片假名字符可以写为全角或半角形式;如果选择该值,则认为写为全角形式的片假名字符等于写为半角形式的同一字符。 
None 指定字符串比较的默认选项设置。 
Ordinal 指示必须使用每个字符的 Unicode 值进行字符串比较;这是一种快速比较方式,但是不区分区域性。如果 xxxx 小于 yyyy,则以“U+xxxx”开头的字符串位于以“U+yyyy”开头的字符串之前。此标志不能和其他标志组合使用,必须单独使用。 
OrdinalIgnoreCase 指示字符串比较必须忽略大小写,然后执行序号比较。这等效于使用固定区域性将字符串转换成大写,然后对结果执行序号比较。 
StringSort 指示字符串比较必须使用字符串排序算法;在这种算法中,连字符和省字号以及其他非字母数字字符均位于字母数字符号前。 

我们默认使用string.CompareTo方法的时候,使用的是None(默认比较规则,排序顺序

    public class MyStringComparer : IComparer
    {
        private CompareInfo myComp = CultureInfo.InvariantCulture.CompareInfo;
        public CompareOptions myOptions = CompareOptions.None;//默认按照字符串比较

        public MyStringComparer()
        {
            myComp = CompareInfo.GetCompareInfo("en-US");
        }

        public MyStringComparer(CompareOptions options)
        {
            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.");
        }


在实现接口的过程中有2个比较重要的对象,

CompareInfo : 实现一组方法进行区分区域性的字符串比较

CompareOptions :指定用于 CompareInfo的比较规则


调用时只要指定不同的CompareOptions就可以得到不同的结果:

            MyStringComparer mc = new MyStringComparer(CompareOptions.None);
            int y = mc.Compare(a, b);//y=-1

            mc.myOptions = CompareOptions.IgnoreCase;
            int z = mc.Compare(a, b);//z=0


详情参阅MSDN文档:

String.CompareTo 方法 (String)




你可能感兴趣的:(算法,String,object,C#,null,internet)