[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

基于反相器的超声波发生和气泡检测电路

本文主要介绍了关于超声波的两种电路——基于反相器的振荡电路和基于逻辑们的气泡检测电路

xehagy的博客 1959

Zynq远程更新程序实战:从emmc到flash的完整方案解析

本文详细解析了Zynq远程更新程序的完整方案,重点探讨了从emmc到flash的实战操作。通过硬件连接限制破解、emmc配置技巧、flash擦写策略优化等关键技术点,提供了可靠的远程更新解决方案,特别适合需要频繁更新boot.bin的应用场景。

weixin_29163797的博客 179

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

【无标题】STM32F767串口空闲中断+DMA实现不定帧长度的接收

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言一、配置串口与DMA二、空闲中断服务函数二.串口+DMA发送三、主函数总结 前言 提示:这里可以添加本文要记录的大概内容: 使用STM32F767实现串口空闲中断+DMA传输接收不定帧长度数据,以及当中可能遇到的错误总结 提示:以下是本篇文章正文内容,下面案例可供参考 一、配置串口与DMA //硬件模块配置可直接通过CUBEMX配置 void MX_USART1_UART_Init(void) { huart1.In.

qq_42589531的博客 1168

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

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

起个名字好难啊 2375

【多媒体交互】Unity+普通摄像头实现UI事件分析

利用摄像头捕捉用户的手势或动作,结合坐标映射与事件系统触发UI交互

qq_38350004的博客 1322

什么是Merkle树?用“文件柜”类比理解区块链的核心技术

Merkle树是一种用于区块链的数据结构,像一个高效的“文件柜”,用于存储和验证大量交易数据。比特币通过Merkle树将交易哈希组织成树状结构,层层汇总,最终生成一个唯一的根哈希,存储在区块头中。这种设计大幅减少数据存储和验证成本,支持快速校验交易的完整性和存在性。Merkle树通过密码学保证数据不可篡改,广泛应用于比特币、区块链及其他分布式系统。它的优势在于高效、轻量和安全,尤其适合轻节点验证和数据同步。理解Merkle树就像掌握区块链的“索引秘籍”,是Web3世界的关键技术。

在路上的专栏 1192

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

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

weixin_34013044的博客 429

每天一个优秀提示词学习收藏 - 文本创作篇(二)

宝子们,今天不藏私啦!我把这段时间四处搜罗、潜心钻研出来的文本创作 Prompt 提示词大礼包双手奉上,这可都是能让你的 AI 创作水平原地起飞的干货!走过路过不要错过,赶紧码住,开启你的 AI 创作进阶之旅吧!

2402

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

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

weixin_34126557的博客 362

71、聚二甲基硅氧烷(PDMS)材料模型验证研究

本研究通过实验与数值模拟相结合的方法,系统探究了聚二甲基硅氧烷(PDMS)的力学性能与粘附行为。重点验证了多种超弹性材料模型在不同剥离速率下的适用性,结果表明Ogden N2模型在预测界面韧性和平均剥离力方面误差最小,表现最优。研究涵盖了PDMS的合成、单轴拉伸试验、剥离测试及有限元分析,为PDMS在机械与摩擦学领域的应用提供了可靠的建模依据,并建议在后续模拟中优先采用Ogden模型。

wine的专栏 1054

13、超声断层乳腺图像融合算法:乳腺癌诊断新突破

本文介绍了一种新型超声断层乳腺图像融合算法,通过结合超声透射(UTTc、UTTα)和反射断层图像(URT),实现对乳腺组织的多参数自动可视化。该算法能有效区分良性与恶性肿瘤,具有高准确性、无辐射、低成本等优势,适用于大规模乳腺癌早期筛查。初步临床测试验证了其可行性,未来有望成为乳腺癌诊断的新标准。

9q8w7e6r5的博客 156

C#排序比较

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

aoding8407的博客 197

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

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

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

weixin_34062469的博客 467

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

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

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

weixin_34068198的博客 394

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

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、付费专栏及课程。

余额充值