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

C#椭圆类继承圆并实现IComparable与IComparer<T>的排序实战 面向对象编程中,继承与接口是实现代码复用和多态的核心机制。通过IComparable和IComparer<T>接口,开发者可以定义对象的默认比较规则和可插拔的外部比较器,从而灵活支持多种排序策略。泛型接口进一步提供了类型安全,避免装箱拆箱,提升性能。这一技术广泛应用于图形处理、电商商品排序等场景。本文以椭圆类继承圆类为例,深入解析如何通过实现IComparable和IComparer<T>接口,实现基于面积、半轴等多维度的排序,并分享继承关系设计、比较逻辑边界处理等实战经验。 阅读详情

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

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

重新实现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)




Unity游戏开发中基于C# List.Sort()的多条件角色排序实战指南 在游戏开发中,集合排序是处理角色、物品或单位顺序的核心操作。其原理是通过比较算法确定元素间的相对位置,高效排序能显著提升游戏逻辑处理性能与用户体验。C#中的List<T>.Sort()方法提供了稳定且高性能的排序实现,它允许通过自定义比较器来定义复杂的排序规则,这对于构建灵活的游戏系统至关重要。在Unity游戏开发实践中,多条件排序常用于角色出战顺序、排行榜或背包整理等场景。本文聚焦于利用List.Sort()方法,结合IComparer<T>接口与Comparison<T>委托,详细解析如何实现如“攻击力 阅读详情

相关推荐

C#泛型协变与逆变:解决类型安全与灵活性的核心机制

在面向对象编程中,泛型是构建类型安全、可复用代码的重要机制。其核心原理在于通过类型参数化实现编译时类型检查,避免运行时错误。这一技术的核心价值在于平衡类型安全与代码灵活性,尤其在处理集合、委托和接口设计时至关重要。在实际应用场景中,开发者常遇到泛型类型转换问题,例如无法将IEnumerable<Derived>隐式转换为IEnumerable<Base>。这正是C#中协变与逆变机制要解决的核心问题——通过out和in关键字,在保证类型安全的前提下,允许泛型接口和委托在继承关系中进行特定方向的类型转换。理解协

weixin_33701617的博客 473

C#中对对象的排序重写IComparer接口

HandsomeBoyJin的专栏 1118

C#使用IComparer自定义List类实现排序的方法

主要介绍了C#使用IComparer自定义List类实现排序的方法,涉及C#使用IComparer接口定义List类进行排序的相关技巧,需要的朋友可以参考下

C# 重写IComparer 接口

首先定义比较类 继承自IComparer<Racer> 1 public class RacerComparer : IComparer<Racer> 2 { 3 public enum CompareType 4 { 5 FirstName, LastName, Coun...

dianzhuique8587的博客 481

R 分析裂区试验设计

裂区试验有主区部分和副区部分, 因而有主区部分误差(误差 a,简记为Ea )和副区部分误差(误差b,简记为Eb) 分别用于测验主区处理以及副区处理和主、副互作的显著性。对同一个二因素试验资料作自由度和平方和的分解,则可发现随机区组的误差项自由度和平方和分别为DFe、SSe,而裂区设计有两个误差项,其自由度和平方和分别为DFEa,DFEb, SSEa, SSEb。而区组,处理效应等各个变异项目的自由

samhuairen的专栏 8934

超螺旋滑模控制(STA)

超螺旋滑模控制又称超扭滑模控制,可以说是二阶系统中最好用的滑模控制方法。

Lyajpunov的博客 1万+

c# IComparer比较字符串

例如:幻灯片50,幻灯片6,幻灯片40 比较完后:幻灯片6,幻灯片40,幻灯片50 public class PathCompare : IComparer<string> { public int Compare(string x, string y) { string[] aBuf = x.Split('\\'); string[]

Have a nice day. 965

基于TI C2000的CCS安装与工程创建完整示例

手把手演示基于TI C2000系列的CCS安装过程及首个工程创建步骤,涵盖环境配置与常见问题处理,助力快速上手嵌入式开发,ccs安装和工程搭建不再难。

weixin_42476987的博客 970

C# 使用IComparer自定义List类的排序方案

List类中不带参数的Sort函数可以用来为List类中的元素排序,但如果List类中的元素类型本身不能直接进行比较(如自定义的struct和很多class),或是希望采用更加灵活的自定义比较方式,可以通过继承了IComparer接口的函数来解决。 代码示例如下: 1)声明一个类 /// /// 人物类 /// public class Person { public strin

起个名字好难啊 2375

025、Zephyr RTOS设备树覆盖与修改

本文分享了在Zephyr RTOS中使用设备树覆盖(overlay)的实战经验。作者通过一个工业数据采集项目中GPIO无法拉高的调试案例,揭示了设备树覆盖的"叠加"本质而非简单替换。文章详细介绍了覆盖文件的正确编写方式,包括节点引用、pinctrl配置等技巧,并总结了常见陷阱如状态设置不完整、别名冲突等问题。特别强调了条件覆盖的用法和调试方法,最后提出了覆盖文件管理的五项实用原则,强调设备树覆盖是硬件与软件之间的重要契约,需要谨慎对待。全文以实际项目为背景,提供了可操作性强的技术建议。

m0_50546716的博客 33

ROS局部路径规划器插件teb_local_planner流程梳理(上)

在我之前的文章《ROS导航包Navigation中的 Movebase节点路径规划相关流程梳理》中已经介绍过Move_base节点调用局部路径规划器插件的接口函数是computeVelocityCommands,接下来,我们就从这个函数入手梳理一下teb_local_planner功能包的工作流程。

慕羽★的博客 5165

C#面向对象实战:Ellipse继承Circle的继承边界与IComparable/IComparer排序设计

面向对象编程中,继承关系设计是核心难点,而接口契约与比较逻辑则直接影响代码的可扩展性。以几何图形建模为例,圆与椭圆之间存在数学上的包含关系,但在代码中实现继承时,需严格遵循里氏替换原则,通过构造函数校验、属性封装与虚方法重写来保证逻辑自洽。IComparable与IComparer接口分别定义了默认排序规则与可插拔排序策略,是C#中处理对象比较的标准方案。该技术方案可广泛应用于图形渲染、数据排序及业务规则引擎等场景,帮助开发者规避类型判断陷阱与浮点数比较误差。本文通过一个完整的C# Demo,深入剖析Ell

weixin_34013044的博客 429

UNet 改进(3):CBAM模块的融合创新

CBAM模块可以灵活地添加到网络的不同位置,本实现选择在初始卷积后添加,既提升了性能又不过度增加计算负担。UNet_CBAM通过集成注意力机制,使网络能够自动聚焦于图像中最相关的区域和特征通道,从而提升了分割性能。然而,传统的UNet在处理复杂场景时,对所有空间位置和通道特征一视同仁,这可能导致对重要特征的关注不足。在实际应用中,特别是在医学图像分析等需要精确分割的场景中,UNet_CBAM展现出了优异的性能。:CBAM添加的计算量很小,却能带来显著的性能提升,具有很好的性价比。

2401_82355416的博客 1645

Unity游戏开发:C# List.Sort()实现角色多条件排序实战指南

在游戏开发中,数据排序是优化玩家体验和提升程序性能的核心技术之一。其原理在于通过定义明确的比较规则,对集合中的元素进行高效重排。这项技术的价值在于,它能将混乱的数据转化为有序信息,直接提升游戏界面的可读性、玩家的决策效率以及系统的运行性能。尤其在角色扮演、策略卡牌等游戏类型中,角色列表的清晰排序是UI/UX设计的基础。应用场景广泛,从队伍管理、背包整理到排行榜单,都离不开高效的多属性排序逻辑。本文聚焦于Unity开发中的具体实践,深入解析如何利用C#的List.Sort()方法,结合Comparison委托

weixin_34126557的博客 362

【Python_PySide6学习笔记(二十四)】菜单栏QMenuBar类的基本用法

此篇文章中介绍 PySide6 中 QMenuBar 类的基本用法,包括"创建菜单栏"、"创建一级菜单"、"创建二级菜单"等,会持续更新,有需要的读者可以点赞收藏,也欢迎在评论区进行讨论。

禾戊之昂的博客 1625

DataCastle-租金预测

ID:编号;时间:房屋信息采集的时间;小区名:房屋所在小区,已脱敏处理;小区房屋出租数量:小区出租房屋数量,已脱敏处理;楼层:0、1、2分别表示楼层低,中,高;总层数:房屋所在建筑的总楼层数,已脱敏处理;房屋面积:房屋面积数值,已脱敏处理;房屋朝向:房屋的朝向;居住状态:房屋的居住状态,表示是否已出租或居住中,已脱敏处理;卧室数量:户型信息,数字表示卧室的个数;卫的数量:户型信息,数字表示卫生间的个数;厅的数量:户型信息,数字表示厅的个数;

优快云 精品推荐 3457

C#排序比较

与C#定义了相等性比较规范一样,C#也定义了排序比较规范,以确定一个对象与另一个对象的先后顺序。排序规范如下 IComparable接口(包括IComparable接口和IComparable<T>接口) >和<运算符 当需要实现排序算法时,使用IComparable接口。在下面的例子中,Array.Sort静态方法可以调用,是因为System.String类...

aoding8407的博客 197

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

C#面向对象实战:椭圆继承圆与IComparable/IComparer接口详解

面向对象编程中,继承与接口是实现代码复用和多态的核心机制。通过基类定义通用行为、子类重写虚方法,结合IComparable与IComparer<T>接口实现对象自身比较与外部比较器分离,可显著提升代码的扩展性与可维护性。这种设计模式在集合排序、业务规则引擎等场景中应用广泛。本文以椭圆继承圆为例,完整演示构造函数链传递、虚方法重写、泛型接口实现及多种比较器排序的工程实践,帮助开发者深入理解C#面向对象设计的核心要点。

weixin_34062469的博客 467

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

C#泛型深度解析:从类型安全到高性能编程实践

泛型是现代编程语言中的核心概念,它通过类型参数化实现了代码的通用性。其原理是在编译时进行类型检查,为不同类型生成特化代码,从而在保证类型安全的同时消除装箱拆箱的性能开销。这一技术价值在于显著提升代码复用率、增强编译时错误检测能力并优化运行时性能。在应用场景上,泛型广泛用于集合操作、算法抽象、接口契约定义以及委托和LINQ查询等。本文聚焦C#泛型,深入探讨泛型类、接口、方法及委托的实现机制,并结合类型约束、协变逆变等高级特性,解析如何在实际开发中规避常见陷阱,实现高效的类型安全编程。

weixin_34068198的博客 394

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

HashSet与SortedSet选型指南:哈希表vs红黑树的性能分野

HashSet和SortedSet是.NET中实现去重的核心集合类型,分别基于哈希表和红黑树两种经典数据结构。哈希表通过哈希函数+桶数组实现接近O(1)的查找与插入,适合高频存在性判断;红黑树则通过自平衡二叉搜索树保障有序性,支持O(log n)范围查询、极值获取与稳定遍历。二者并非替代关系,而是针对‘速度优先’与‘秩序刚需’场景的分工设计。在电商订单去重、权限管理、风控日志分析等典型业务中,合理选用可将耗时从毫秒级压至微秒级,并显著降低内存开销。本文结合WizardWu技术笔记的底层洞见,解析构造预设、比

baochuanying9531的博客 457

重写compare

compare方法中,object1代表当前对象,object2代表与当前对象进行比较的对象。 当向Set集合中新添加一个元素的时候,这个元素会和之前集合里面的所有元素进行比较,从而选择插入的位置。 compare方法的返回值是int类型。例如”return o1 - o2“, 返回一个正数,表示o1比o2大,把o1排在o2后面。 返回负数相反。 返回0,表示无所谓。 实例: import java.util.Comparator; import java.util.TreeSet; //.

qq_39484718的博客 2788

C# string 之 CompareTo、Compare

==、Equals、CompareTo、Compare

m0_59587869的博客 1330

c#重新string.方法_String.Compare()方法以及C#中的示例

c#重新string.方法 C#String.Compare()方法 (C# String.Compare() Method) String.Compare() method is used to compare two string objects, it returns values 0, less than 0 or greater than 0 based on the differenc...

961

推荐项目:Objects Comparer - 深度对象比较的利器

推荐项目:Objects Comparer - 深度对象比较的利器 在软件开发中,对象间的深度比较是一项基础但往往复杂的任务。当对象结构复杂或需忽略特定属性时,手动对比往往会变得极其繁琐且容易出错。为此,我们发现了一个强大的解决方案——《Objects Comparer》。它不仅简化了对象间成员对成员的递归比对,还提供了定制化比较规则的能力,极大地提升了效率和准确性。 技术剖析 《Objects ...

gitblog_00931的博客 512

C#使用Objects Comparer进行对象比较

ObjectsComparer是用于对象比较的工具,c#常见的数据结构都是可以用这个三方库进行对比,比较复杂的对象也是可以比较的。有的时候我们打开编辑页面,实际未修改数据,再去点击保存按钮要不一个一个字段去对比有没有修改数据。获取两个对象之间值是否有改变,如果没有改变,我们就给出"数据未修改,请问是否关闭窗体“等提示。像做过.net客户端开发的人都知道,我们在维护一些基础数据的时候都避免不了要编辑数据!简而言之,ObjectsComparer是一个对象到对象的比较器,...

biyusr的专栏 734

重写CompareTo

CompareTo( Object o ) compare默认被当前对象调用,比较属性时可以用this.调用,而这个参数 Object o 代表前一个对象。当向Set集合中新添加一个元素的时候,这个元素会和之前集合里面的所有元素进行比较,从而选择插入的位置。 compareTo方法的返回值是int类型,例如,当” this.属性 - o.属性 “ 返回一个正数,表示this比o大,把this排在o后面。 返回负数相反。 返回0,表示无所谓。 以下的例子,把Teacher类的对象先按...

qq_39484718的博客 3499
上一篇: C# 一个关于等差数列的算法
下一篇: [C#] 10进制转62进制,实现穷举指定位数的所有密码组合(暴力破解)
Hauk
博客等级 码龄15年 219粉丝 20原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值