[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

如果使用ssms连接SQLserver的时候出现无法连接到服务器。

如果使用ssms连接SQLserver的时候出现无法连接到服务器。 Lan 2020-03-29 22:11 329 人阅读 0 条评论 标题: 连接到服务器------------------------------无法连接到...

Vastsa的博客 1万+

Palabos 并行计算与多物理场模拟实战指南

本文详细介绍了Palabos在并行计算与多物理场模拟中的实战应用。作为基于C++和LBM的开源CFD工具,Palabos通过MPI实现高效并行计算,特别适合处理复杂流体模拟问题。文章涵盖从基础安装、多物理场耦合技巧到性能优化策略,并分享工业级应用案例与调试经验,帮助开发者快速掌握这一强大工具。

4k5l6j7h8的博客 245

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

Fastjson2 2.0.26反序列化漏洞深度剖析:从原理到PoC构造

本文深度剖析了Fastjson2在2.0.26及之前版本中存在的反序列化漏洞。该漏洞允许攻击者通过构造包含恶意TemplatesImpl对象的JSONArray,并利用BadAttributeValueExpException触发,在反序列化过程中实现远程代码执行。文章从漏洞原理、PoC构造、利用链分析到防御建议,提供了全面的技术解读,帮助开发者和安全人员理解其危害并采取应对措施。

d3e4f的博客 1051

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

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

起个名字好难啊 2375

全覆盖路径规划开源项目Clean-robot-turtlebot3关键函数解析(上)

本系列文章主要介绍全覆盖路径规划开源项目Clean-robot-turtlebot3的相关内容,包含如下四篇文章,分别介绍了开源项目Clean-robot-turtlebot3流程的概括总结、ROS坐标系常用坐标及其变换、Clean-robot-turtlebot3关键函数解析等内容。

慕羽★的博客 2778

Python爬虫实战:社交媒体热点事件追踪与情感分析可视化

本文探讨了如何利用Python爬虫技术从微博和Twitter等社交媒体平台抓取数据,进行热点事件追踪和情感分析,并通过可视化方式展示舆论情感变化。文章详细介绍了最新的爬虫技术、数据处理方法和可视化实现,提供了完整的代码示例,帮助读者构建自己的社交媒体分析系统。关键词:Python爬虫、社交媒体分析、情感分析、数据可视化、热点追踪爬虫框架:Requests-HTML、aiohttp、Twint(Twitter专用)数据处理文本处理:Jieba(中文分词)、NLTK(英文处理)情感分析。

2201_76125261的博客 1105

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

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

weixin_34013044的博客 429

EndNote X9 快速上手教程(毕业论文参考文献管理器)

EndNote X9 快速上手教程一、EndNote X9安装1.安装2 安装之后重要步骤二、第一次打开 EndNote三、参考文献引用1. 导入知网文献2. 参考文献引用四、常见问题1. 引用文献中出现%J的问题2 参考文献中出现et.al1 在文章中引用的编号的地方出现2 在参看文献列表里出现 一、EndNote X9安装 1.安装 打开文件夹 安装前,一定要读 #Readme.txt 文件 一定要把License.dat和ENX9Inst.msi放在同一文件夹,安装的时候会自动激活。 我的安装路

程序员,他们想的是什么?他们想的永远都是技术,他们崇尚的也永远都是技术。 2万+

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

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

weixin_34126557的博客 362

12、硬件工程师笔试面试——MOS管(2025版本)

在设计和测试过程中,可以参考相关的EMC测试标准和指南,如CE认证EMC电磁兼容测试介绍 和电磁兼容性(EMC)测试方法与整改指南 ,以及电磁兼容(EMC)的标准与测试内容 ,来确保MOSFET的EMC性能符合行业标准。在高频应用中,MOSFET的开关速度对电路的整体性能至关重要。是一款高电压同步N沟道MOSFET驱动器,具有自举电源电压至114V的能力,宽VCC电压范围,自适应贯通保护功能,以及高达1.4A的峰值顶端栅极上拉电流,适用于分布式电源架构、汽车电源、高密度电源模块和电信系统等应用。

XU157303764的博客 7093

[deprecated]第二章:DRM 框架概述:2.2 GEM显存管理概述

本文深入分析了Linux DRM子系统中GEM(Graphics Execution Manager)的显存管理机制。GEM通过核心数据结构drm_gem_object抽象显存buffer,结合drm_vma_offset_manager和drm_mm实现高效的地址空间分配与管理。该系统支持显存动态分配/回收、用户空间mmap映射、多进程访问隔离和跨设备共享等关键功能,并通过引用计数和同步机制确保并发安全。

图形/计算GPU的驱动与虚拟化技术分享园地 2544

C#排序比较

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

aoding8407的博客 197

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

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

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

weixin_34062469的博客 467

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

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

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

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

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

weixin_34068198的博客 394

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

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的博客 3498
上一篇: 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、付费专栏及课程。

余额充值