排序集合的一个小坑

原来一直用SortList,SortedDictionary来作为键值对存储的排序集合来用,心中就默认是以key按ascall排序来存放的,在之前的案例中也没有出现问题,在最近一个demo中,打破了原来的自以为是的认识,因为在key中不但有大写小,还有特列符号。

先看一下代码:

Console.WriteLine("-----------按ASCII排序-----------");
var chars = new char[] { 'A', '[', ']', 'a' };
foreach (var c in chars)
{Console.WriteLine($"{c}:{(int)c}");
}
Console.WriteLine("-----------排序集合的排序-----------");
var list = new SortedList<string, int>();
list.Add("a", 97);
list.Add("A", 65);
list.Add("[", 91);
list.Add("]", 93);
foreach (var item in list)
{Console.WriteLine($"{item.Key}:{item.Value}");
}

结果如下,显然SortList的key结果不是想要的按ascall排序的。

a10e163ef9c493f2e2f9c6389fa6a1ec.png

那怎么才能达到按ascall呢?那就自己动手做一个排序器吧,其实就是实现IComparer<string>接口中的Compare,告诉两个string的比较规则,那自然多个数据的排序就能按这种规则给出来。当然我给的按ascall的这个规则,丝毫没有优美而言,只是能表示出意思来。

Console.WriteLine("-----------新排序集合的排序-----------");
var newList = new SortedList<string, int>(new ASCALLComparer());
newList.Add("a", 97);
newList.Add("A", 65);
newList.Add("[", 91);
newList.Add("]", 93);
foreach (var item in newList)
{Console.WriteLine($"{item.Key}:{item.Value}");
}public class ASCALLComparer : IComparer<string>
{public int Compare(string? x, string? y)
{if (x == null || y == null){throw new Exception("x or y is null");}if (x?.Length != y?.Length){if (x?.Length < y?.Length){for (var i = 0; i < x?.Length; i++){if ((int)x[i] > (int)y[i]){return 1;}else if ((int)x[i] < (int)y[i]){return -1;}}return -1;}else{for (var i = 0; i < y?.Length; i++){if ((int)x[i] > (int)y[i]){return 1;}else if ((int)x[i] < (int)y[i]){return -1;}}return 1;}}else{for (var i = 0; i < x?.Length; i++){if ((int)x[i] > (int)y[i]){return 1;}else if ((int)x[i] < (int)y[i]){return -1;}}return 0;}}
}

结果为:

0f4616c28a49e65d3fce21ffefd91184.png

那原来的排序规则是什么呢?我枚举了一下ascall范围内部分可见字符,下面是正序的排序方式:

序号
符号
ascall值

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

_

-

,

;

:

!

?

.

'

"

(

)

[

]

{

}

@

*

/

\

&

#

%

`

^

+

<

=

>

|

~

$

0

1

2

3

4

5

6

7

8

9

a

A

b

B

c

C

d

D

e

E

f

F

g

G

h

H

i

I

j

J

k

K

l

L

m

M

n

N

o

O

p

P

q

Q

r

R

s

S

t

T

u

U

v

V

w

W

x

X

y

Y

z

Z

95

45

44

59

58

33

63

46

39

34

40

41

91

93

123

125

64

42

47

92

38

35

37

96

94

43

60

61

62

124

126

36

48

49

50

51

52

53

54

55

56

57

97

65

98

66

99

67

100

68

101

69

102

70

103

71

104

72

105

73

106

74

107

75

108

76

109

77

110

78

111

79

112

80

113

81

114

82

115

83

116

84

117

85

118

86

119

87

120

88

121

89

122

90

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/298081.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

爱是天时地利的迷信

1 别人撒娇你撒娇2 据说套着这个白袋子晒鞋鞋就不会发黄了。。3 蚂蚁&#xff1a;为什么要欺负我&#xff01;4 这是天空的心电图吗5 有回应的喜欢真好 6 随主人这事儿原来是真的…7 被别人喜欢时的心理活动图自回忆专用小马甲你点的每个赞&#xff0c;我都认真当成了喜欢

Juniper Firewall多进单出配制实例

Technorati 标签: juniper,多进单出,配置实例,firewallJuniper firewall多進單出配置。想法是這樣的用一台firewall將這幾條ISP線路都接入&#xff0c;再通過一個trunk口出來&#xff0c;通過一台L2 switch劃分出幾個VLAN&#xff0c;分別對應不同的ISP線路。這樣做的好處就不多…

刷题≠学好数学,近百位名校名师告诉你,数学是怎么学好的?

▲ 点击查看 数学是个神奇的科目&#xff0c;它存在着一种“梯次掉队”的现象。不是说你低年级的知识学好了&#xff0c;高年级的知识就一定能学好。相信大家都有这种体会&#xff1a;一二年级孩子成绩不相上下&#xff0c;但到三四年级的时候&#xff0c;有一批学生的数学成绩…

android 系统之ContentProvider

基于上一篇的数据库操作&#xff0c;又写了一个ContentProvider的示例。把SQLiter 的数据提供出去供别的项目进行访问。 这一篇的代码要求熟悉SQLiter 的API. 首先&#xff0c;我们编写一个类extents ContentProvider &#xff0c;重写他的方法。 URI 在http 中我们称为统一资源…

你是中层管理者?嗯,一个表面看似风光,实际却很 “鸡肋” 的重要岗位

这是头哥侃码的第246篇原创每年的六七月份&#xff0c;上海都会进入梅雨季节。这段时期的上海天气就好比大小姐的脾气&#xff0c;阴晴不定&#xff0c;完全看心情做事&#xff0c;心情好的时候&#xff0c;给你个阳光&#xff0c;让你的生活和休闲时光多一些灿烂&#xff0c;心…

重温SQL——行转列,列转行(转:http://www.cnblogs.com/kerrycode/archive/2010/07/28/1786547.html)...

行转列&#xff0c;列转行是我们在开发过程中经常碰到的问题。行转列一般通过CASE WHEN 语句来实现&#xff0c;也可以通过 SQL SERVER 2005 新增的运算符PIVOT来实现。 用传统的方法&#xff0c;比较好理解。层次清晰&#xff0c;而且比较习惯。 但是PIVOT 、UNPIVOT提供的语法…

要男女朋友有什么用?

1 题&#xff1a;我不要面子的嘛&#xff01;2 狗都有人给撑伞了。。3 这大概就是传说中的一见钟情吧4 5 南方人说话有多软糯6 男女朋友有什么用你点的每个赞&#xff0c;我都认真当成了喜欢

低代码应用创新成果——轴承行业数字化智造系统(含MES/ERP/WMS)

轴承是当代机械设备中一种不可或缺的零部件&#xff0c;广泛应用于汽车、铁路车辆及各类工业机械和家用电器等国民经济的重要领域&#xff0c;是一种节约能源、提高效率的伟大发明。轴承行业作为装备制造业的先锋&#xff0c;一直以来都走在数字化转型的前列&#xff0c;引领行…

HelloSilverlight

一&#xff1a;输入姓名并选中一个日期&#xff0c;将在下面显示 二:XAML代码 <UserControl x:Class"HelloSilverlight.MainPage"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2…

21世纪7大数学难题,解决其中一个你就成为了百万富翁!

全世界只有3.14 % 的人关注了爆炸吧知识百万富翁你也可以昨天一大早&#xff0c;知识君就收到模友送的3枝红玫瑰。仔细一看&#xff0c;原来又是来跟知识君约稿的。。。知识君只能说&#xff1a;1900年&#xff0c;希尔伯特&#xff08;传送门&#xff09;在巴黎国际数学家代表…

在 Azure VM 上使用 Jitsi 搭建私人视频会议

点击上方蓝字 / 关注“汪宇杰博客”原文&#xff1a;Azure Tips And Tricks翻译&#xff1a;汪宇杰私人视频会议市面上有许多视频会议应用程序&#xff0c;例如 Zoom、Microsoft Teams 和 Skype。有时&#xff0c;您需要自己的服务&#xff0c;以让自己更安全并在自己的公司内部…

[LeetCode]119.Pascal#39;s Triangle II

题目 Given an index k, return the kth row of the Pascal’s triangle. For example, given k 3, Return [1,3,3,1]. Note: Could you optimize your algorithm to use only O(k) extra space? 思路 无 代码 /**------------------------------------* 日期&#xff1a…

终于有人做了我一直想做而不敢做的事。。

1 初中物理是不是学过&#xff0c;受力面积小&#xff0c;相应的压力就大&#xff5e;我觉得应该直接趴上去&#xff0c;一定行&#xff5e;反正我也是瞎说的2 不是我吹&#xff0c;换成是我&#xff0c;这包子能吃五屉3 交警蜀黍耐心的领着这位行人过马路&#xff0c;麻烦你快…

.NET 6 中的隐式命名空间引用

.NET 6 中的隐式命名空间引用Intro之前写过一篇隐式命名空间引用的大概介绍&#xff0c;在一些小的测试项目中也有在用&#xff0c;一直没作为示例给大家分享&#xff0c;主要原因在于之前看到了一个关于隐式命名空间引用的 Github issue 提到会有一些破坏性的变更&#xff0c;…

vscode函数跳转插件_人生苦短,我们为 Cocos Creator 开发的插件和工具

在使用 Cocos Creator 开发项目的过程中&#xff0c;为了提高开发效率我们开发了很多扩展插件&#xff0c;本文介绍常用的几款&#xff0c;抛砖引玉&#xff0c;希望给大家带来帮助。腾讯开心鼠英语网页扩展&#xff1a;运行时查看场景节点树Cocos Creator 本地项目通常会在 Ch…

SQLSERVER 日志收缩

SQL2008 的收缩日志 由于SQL2008对文件和日志管理进行了优化&#xff0c;所以以下语句在SQL2005中可以运行但在SQL2008中已经被取消&#xff1a;(SQL2005)BackupLog DNName with no_loggodumptransaction DNName with no_loggoUSE DNName DBCC SHRINKFILE (2)Go---------------…

解决win7“该文件没有与之关联的程序来执行该操作”

机器装好了win7系统。右击“计算机”管理的时候&#xff0c;出现“该文件没有与之关联的程序来执行该操作”能是因为删除了start menu下的某个文件,经过分析,找到了如下的解决方法:定位到注册表HKEY_CLASSES_ROOT\CLSID\{20D04FE0-3AEA-1069-A2D8-08002B30309D}\shell\Manage\c…

绝不能放进微波炉的10样东西,最后一个太意外

全世界只有3.14 % 的人关注了爆炸吧知识前一阵&#xff0c;网上有一段用微波炉加热葡萄的视频&#xff0c;成了新闻热点。研究员在实验中发现&#xff0c;两颗葡萄放进微波炉后&#xff0c;竟然会产生电弧。图片来源网络之前小编加热汉堡的时候&#xff0c;本来想大快朵颐一顿&…

在 .NET 6 中使用 DATEONLY 和 TIMEONLY

在 .NET 6 中使用 DATEONLY 和 TIMEONLY在 即将发布的.NET 6中&#xff0c;引入了两种期待已久的类型作为核心库的一部分。DateOnly和TimeOnly允许开发人员表示 DateTime 的日期或时间部分。这两种新类型是结构体&#xff08;值类型&#xff09;&#xff0c;可以在您的代码独立…

vue 3.0 正式版_Vuejs 3 Release:One Piece. Vuejs 3.0 正式版发布!代号:海贼王

Vuejs 3.0 在北京时间2020年9月19日凌晨&#xff0c;终于发布了 3.0 版本&#xff0c;代号&#xff1a;One Piece。此次vue3.0 为用户提供了全新的 composition-api 以及更小的包大小&#xff0c;和更好的 TypeScript 支持。Vue3.0发布链接​github.comVue 是当前非常流行的框架…