>我有两个字符串,它们不相等:
var filename1 = "Statuts PE signés.pdf";
var filename2 = "Statuts PE signés.pdf";
文件名 1 的字符:
[0] S= 83
[1] t=116
[2] a=97
[3] t=116
[4] u=117
[5] t=116
[6] s=115
[7] =32
[8] P=80
[9] E=69
[10] =32
[11] s=115
[12] i=105
[13] g=103
[14] n=110
[15] e=101
[16] ´=769
[17] s=115
[18] .=46
[19] p=112
[20] d=100
[21] f=102
文件名2的字符:
[0] S=83
[1] t=116
[2] a=97
[3] t=116
[4] u=117
[5] t=116
[6] s=115
[7] =32
[8] P=80
[9] E=69
[10] =32
[11] s=115
[12] i=105
[13] g=103
[14] n=110
[15] é=233
[16] s=115
[17] .=46
[18] p=112
[19] d=100
[20] f=102
我可以在字典中添加这两个条目:
var files1 = new Dictionary<string, int>();
files1.Add(filename1, 1);
files1.Add(filename2, 2); // OK
但是当我尝试使用排序字典时,我得到"参数异常:具有相同键的条目已经存在":
var files2 = new SortedDictionary<string, int>();
files2.Add(filename1, 1);
files2.Add(filename2, 2); // throw "ArgumentException : An entry with the same key already exists"
为什么?
这是因为默认情况下Dictionary<string, TValue>
使用EqualityComparer<string>.Default
,它认为filename1
和filename2
不同,因为它使用序数比较。另一方面,SortedDictionary<string, TValue>
使用Comparer<string>.Default
,它使用不变比较,认为这些字符串相等:
Console.WriteLine(filename1 == filename2); // false
Console.WriteLine(EqualityComparer<string>.Default.Equals(filename1, filename2)); // false
Console.WriteLine(Comparer<string>.Default.Compare(filename1, filename2) == 0); // true
也可以通过将StringComparer.Ordinal
传递给构造函数来强制SortedDictionary
序比较:
Console.WriteLine(StringComparer.Ordinal.Compare(filename1, filename2) == 0); // false