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)来排序的更多相关文章

  1. 6.1 如何在spring中自定义xml标签

    dubbo自定义了很多xml标签,例如<dubbo:application>,那么这些自定义标签是怎么与spring结合起来的呢?我们先看一个简单的例子. 一 编写模型类 package ...

  2. 如何在pyqt中自定义无边框窗口

    前言 之前写过很多关于无边框窗口并给窗口添加特效的博客,按照时间线罗列如下: 如何在pyqt中实现窗口磨砂效果 如何在pyqt中实现win10亚克力效果 如何在pyqt中通过调用SetWindowCo ...

  3. C#如何在DataGridViewCell中自定义脚本编辑器

    上一篇博文探讨了如何自定义DataGridViewColumn实现一个TreeViewColumn来在DataGridView控件中显示TreeView控件,其实我们还可以继续发挥想象,自定义其他的列 ...

  4. 如何在CODESOFT中自定义删除文档备料

    CODESOFT 2015是先进的标签设计与集成软件.在使用CODESOFT制作条码标签时,为方便省时,我们可以事先创建自己的文档模板,保存它们以供将来使用.接下来,小编就讲讲CODESOFT 201 ...

  5. [VBA]用一个简单例子说明如何在Excel中自定义函数

    Excel中的函数无疑是强大的,但是再强大的战士也有他脆弱的脚后跟[1].这两天在使用Excel的时候遇到了一个需求,要在某一个单元格里面自动计算今天是星期几(如显示 Today is Tuesday ...

  6. 如何在 Azure 中自定义 Windows 虚拟机

    若要以快速一致的方式配置虚拟机 (VM),通常需要某种形式的自动化. 自定义 Windows VM 的一种常用方法是使用适用于 Windows 的自定义脚本扩展. 本教程介绍如何执行下列操作: 使用自 ...

  7. 如何在C#中自定义自己的异常

    在C#中所有的异常类型都继承自System.Exception,也就是说,System.Exception是所有异常类的基类. 总起来说,其派生类分为两种:1. SystemException类: 所 ...

  8. 如何在pyqt中自定义SwitchButton

    前言 网上有很多 SwitchButton 的实现方式,大部分是通过重写 paintEvent() 来实现的,感觉灵活性不是很好.所以希望实现一个可以联合使用 qss 来更换样式的 SwitchBut ...

  9. 如何在 pyqt 中自定义工具提示 ToolTip

    前言 Qt 自带的工具提示样式不太好看,就算加了样式表也时不时会失效,同时工具提示没有阴影,看起来就更难受了.所以本篇博客将会介绍自定义工具提示的方法,效果如下图所示: 实现过程 工具提示其实就是一个 ...

随机推荐

  1. Java 8,Jenkins,Jacoco和Sonar进行持续集成

    技术环境 在以安全与质量为主要驱动力的项目中,CI至关重要. 因此,我从我的团队开始进行"概念验证",以表明以下技术已准备好协同工作: Java 8, NetBeans 8.0 & ...

  2. 黄聪:微信小程序 服务器 TLS1.0 1TLS.2 配置详细教学!

    下载IISCrypto.exe 点击best 工具自动推荐选中 也可以定义勾选 选择配置完成 然后点击”apply“ 软件弹窗提醒你 手动重启服务器!!!重启服务器 搞定! 最后 https://ww ...

  3. 【git】代码回退指定commit

    [注意:如果提交的错误代码较少,可以在本地修改成 commit之前的正确代码样子,然后再提交一次即可.不用麻烦的操作回滚.] 开发人员错误将代码提交到gitlab的远程dev分支,回滚方法如下: 1. ...

  4. [ida]查看某一函数在程序中被谁引用

    1. 点亮函数名 2.view - open subviews - cross references 注意:不要点击绘图那个

  5. 2018-2-13-win10-UWP-MessageDialog-和-ContentDialog

    原文:2018-2-13-win10-UWP-MessageDialog-和-ContentDialog title author date CreateTime categories win10 U ...

  6. ABAP 7.4 新语法-内嵌生命和内表操作(转)

    转自:https://www.cnblogs.com/mingdashu/p/6744637.html ABAP 7.4 新语法-内嵌生命和内表操作   1.内嵌声明 2.内表操作 3.opensql ...

  7. 帝国CMS QQ登陆接口插件 适用于所有帝国7.2版本

    插件名称:帝国CMS-QQ登录插件 插件作者:帝国CMS官方 插件介绍:帝国CMS系统的QQ登录插件. 官方网站:http://www.phome.net ---------------------- ...

  8. 致Python初学者的六点建议

    Python是最容易学习的编程语言之一,其语法近似英语.通常,初学者只会遇到一些小麻烦,如强制缩进.在函数中使用self等. 然而,当开始阅读.复制和编辑他人代码时,麻烦就接踵而至了. 这里,我将解释 ...

  9. CentOS7打开、关闭防火墙。

    CentOS7 以上机器一些命令和低版本CentOS是有些差异的,本文只针对CentOS7 以上版本. CentOS7使用firewalld打开关闭防火墙与端口1.firewalld的基本使用启动: ...

  10. mysql使用命令

    1.创建用户 create user 'name'@'host' identified by 'psssword'; 2.授权 grant select, updata,insert (all) on ...