C# SortedDictionary抛出;已存在相同的密钥“;有两个不同的条目

C# SortedDictionary抛出;已存在相同的密钥“;有两个不同的条目,c#,C#,我有两个字符串,它们不相等: var filename1 = "Statuts PE signés.pdf"; var filename2 = "Statuts PE signés.pdf"; filename1的字符: [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

我有两个字符串,它们不相等:

   var filename1 = "Statuts PE signés.pdf";
   var filename2 = "Statuts PE signés.pdf";
filename1的字符:

[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
filename2的字符:

[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 files1=newdictionary();
files1.Add(filename1,1);
files1.Add(filename2,2);//好啊
但当我尝试使用SortedDictionary时,会得到“ArgumentException:已存在具有相同键的条目”:

var files2=newsorteddictionary();
files2.Add(filename1,1);
files2.Add(filename2,2);//抛出“ArgumentException:已存在具有相同键的条目”

为什么?

这是因为默认情况下,
字典
使用
相等比较。默认情况下,
文件名1
文件名2
不同,因为它使用顺序比较。另一方面,
SortedDictionary
使用
Comparer.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

我猜有些等于覆盖或==运算符。如果对字符串调用GetHashCode(),则会得到不同的值。我不确定这一解决方案的影响是什么->
var files2=new SortedDictionary();files2.Add(filename1.GetHashCode(),1);files2.Add(filename2.GetHashCode(),2)。自担风险使用。
Console.WriteLine(filename1 == filename2); // false
Console.WriteLine(EqualityComparer<string>.Default.Equals(filename1, filename2)); // false
Console.WriteLine(Comparer<string>.Default.Compare(filename1, filename2) == 0); // true
Console.WriteLine(StringComparer.Ordinal.Compare(filename1, filename2) == 0); // false