原来一直用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();
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排序的。
那怎么才能达到按ascall呢?那就自己动手做一个排序器吧,其实就是实现IComparer接口中的Compare,告诉两个string的比较规则,那自然多个数据的排序就能按这种规则给出来。当然我给的按ascall的这个规则,丝毫没有优美而言,只是能表示出意思来。
Console.WriteLine("-----------新排序集合的排序-----------");
var newList = new SortedList(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
{
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;
}
}
}
结果为:
那原来的排序规则是什么呢?我枚举了一下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