如何在 C# 中自定义 Comparer,以实现按中文拼音(a-z)来排序
1. 为何要自定义 Comparer
a. 先看如下代码
class Program
{
public static void Main(string[] args)
{
List<string> words = new List<string>() { "我", "b", "中", "a", "是", "k", "人" };
words.Sort();
PrintResult(words);
Console.ReadLine();
} private static void PrintResult(IEnumerable<string> words)
{
if (words == null)
{
return;
}
int i = ;
foreach (string item in words)
{
if (i > )
{
Console.Write(", ");
}
Console.Write(item);
i++;
}
}
}
b. 运行结果
结论:和我们预想的不一致!
2. 自定义 Comparer
CultureStringComparer.cs
using System;
using System.Globalization; public class CultureStringComparer : StringComparer
{
private CompareInfo _compareInfo;
private CompareOptions _options;
private bool _ignoreCase; public CultureStringComparer(CompareInfo compareInfo, CompareOptions options)
{
_compareInfo = compareInfo;
_options = options;
_ignoreCase = (options & CompareOptions.IgnoreCase) == CompareOptions.IgnoreCase ||
(options & CompareOptions.OrdinalIgnoreCase) == CompareOptions.OrdinalIgnoreCase;
} public override bool Equals(object obj)
{
if (!(obj is CultureStringComparer comparer))
return false; if (_ignoreCase != comparer._ignoreCase)
return false; return _compareInfo.Equals(comparer._compareInfo) && _options == comparer._options;
} public override int GetHashCode()
{
int code = _compareInfo.GetHashCode();
if (!_ignoreCase)
return code; return ~code;
} public override bool Equals(string x, string y) =>
(
string.Equals(x, y, StringComparison.Ordinal)
|| (x != null && y != null) && _compareInfo.Compare(x, y, _options) ==
); public override int Compare(string x, string y)
{
if (string.Equals(x, y, StringComparison.Ordinal))
return ; if (x == null)
return -; if (y == null)
return ; return _compareInfo.Compare(x, y, _options);
} public override int GetHashCode(string obj)
{
if (obj == null)
throw new ArgumentNullException(nameof(obj)); return _compareInfo.GetHashCode(obj, _options);
}
}
测试示例
class Program
{
public static void Main(string[] args)
{
CultureStringComparer cultureStringComparer = new CultureStringComparer(
CompareInfo.GetCompareInfo("zh-cn"),
CompareOptions.IgnoreCase);
List<string> words = new List<string>()
{
"我", "b", "中", "a", "是", "k", "人"
};
words.Sort(cultureStringComparer); PrintResult(words);
Console.ReadLine();
} private static void PrintResult(IEnumerable<string> words)
{
if (words == null)
{
return;
}
int i = ;
foreach (string item in words)
{
if (i > )
{
Console.Write(", ");
}
Console.Write(item);
i++;
}
}
}
运行结果
如何在 C# 中自定义 Comparer,以实现按中文拼音(a-z)来排序的更多相关文章
- 6.1 如何在spring中自定义xml标签
dubbo自定义了很多xml标签,例如<dubbo:application>,那么这些自定义标签是怎么与spring结合起来的呢?我们先看一个简单的例子. 一 编写模型类 package ...
- 如何在pyqt中自定义无边框窗口
前言 之前写过很多关于无边框窗口并给窗口添加特效的博客,按照时间线罗列如下: 如何在pyqt中实现窗口磨砂效果 如何在pyqt中实现win10亚克力效果 如何在pyqt中通过调用SetWindowCo ...
- C#如何在DataGridViewCell中自定义脚本编辑器
上一篇博文探讨了如何自定义DataGridViewColumn实现一个TreeViewColumn来在DataGridView控件中显示TreeView控件,其实我们还可以继续发挥想象,自定义其他的列 ...
- 如何在CODESOFT中自定义删除文档备料
CODESOFT 2015是先进的标签设计与集成软件.在使用CODESOFT制作条码标签时,为方便省时,我们可以事先创建自己的文档模板,保存它们以供将来使用.接下来,小编就讲讲CODESOFT 201 ...
- [VBA]用一个简单例子说明如何在Excel中自定义函数
Excel中的函数无疑是强大的,但是再强大的战士也有他脆弱的脚后跟[1].这两天在使用Excel的时候遇到了一个需求,要在某一个单元格里面自动计算今天是星期几(如显示 Today is Tuesday ...
- 如何在 Azure 中自定义 Windows 虚拟机
若要以快速一致的方式配置虚拟机 (VM),通常需要某种形式的自动化. 自定义 Windows VM 的一种常用方法是使用适用于 Windows 的自定义脚本扩展. 本教程介绍如何执行下列操作: 使用自 ...
- 如何在C#中自定义自己的异常
在C#中所有的异常类型都继承自System.Exception,也就是说,System.Exception是所有异常类的基类. 总起来说,其派生类分为两种:1. SystemException类: 所 ...
- 如何在pyqt中自定义SwitchButton
前言 网上有很多 SwitchButton 的实现方式,大部分是通过重写 paintEvent() 来实现的,感觉灵活性不是很好.所以希望实现一个可以联合使用 qss 来更换样式的 SwitchBut ...
- 如何在 pyqt 中自定义工具提示 ToolTip
前言 Qt 自带的工具提示样式不太好看,就算加了样式表也时不时会失效,同时工具提示没有阴影,看起来就更难受了.所以本篇博客将会介绍自定义工具提示的方法,效果如下图所示: 实现过程 工具提示其实就是一个 ...
随机推荐
- 愉快地使用Groovy Shell
这是一篇有关Groovy Shell的帖子,以及它如何在日常工作中为您提供帮助(只要您是软件开发人员).无论您使用哪种编程语言或技术,都可以从Groovy Shell中受益.唯一真正的要求是您能够编写 ...
- HikariCP监控指标介绍和应用
概述 HikariCP提供了一些监控指标,他的监控指标都是基于MicroMeter提供出来的,然后支持Prometheus和Dropwizard.本次我们将讨论一下HikariCp的监控指标有哪些,为 ...
- 自定义Visual Studio调试器中的对象显示方式
你有没有盯着调试器窗口中的对象,并希望你可以通过其他类型的东西来查看这些对象?我当然有!扩展项目以确定每个人的身份可能会非常快速.理想情况下,通过特定的属性值快速定位它们会很棒.对我们来说幸运的是,V ...
- File文件的创建,删除 createNewFile() delete()
package seday03; import java.io.File;import java.io.IOException; /*** 使用File新建一个test1.txt文件* @author ...
- GALAXY OJ NOIP2019联合测试2-普及组
概要: 今天比了个赛,还挺水,只不过不太理想. 题目: Problem : 韬韬抢苹果 又到了收获的季节,树上结了许多韬韬,错了,是许多苹果,有很多个小韬韬都来摘苹果.每个韬韬都想要最大的苹果,所以发 ...
- JVM垃圾回收器原理及使用介绍
JVM垃圾回收器原理及使用介绍 垃圾收集基础 引用计数法(Reference Counting) 标记-清除算法(Mark-Sweep) 复制算法(Copying) 标记-压缩算法(Mark-Comp ...
- SpringCloud之API网关与服务发现——Cloud核心组件实战入门及原理
微服务发展历史 单体模式——>服务治理(服务拆分)——>微服务(细分服务)——>Segments(服务网格) 微服务 VS SOA 微服务:模块化.独立部署.异构化 SOA:共同的治 ...
- pycharm2019.2一个奇怪的bugger,执行后输出内容被莫名处理
2019-08-20 07:45:07 python爬虫是一直来大家都用的多的,我也是常常用到. requests做请求方便的很,但是今天却遇到requests的bug.text内容不可信. pych ...
- 【JavaWeb】EL表达式
EL表达式 EL表达式语言,用于简化JSP的输出: EL表达式的基本语法:${表达式}: 示例:<h1>学生姓名:${student.name}</h1> 作用域对象 忽略书写 ...
- oracle SSL 配置
可以参考metalink号:762286.1 End To End Examples of using SSL With Oracle's JDBC THIN Driver ====== 大致 ...