c# - SortedDictionary 抛出带有两个不同条目的 "same key already exists"

标签 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] 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

但是当我尝试使用 SortedDictionary 时,我得到“ArgumentException:已存在具有相同键的条目”:

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 ,它认为 filename1filename2不同,因为它使用序数比较。另一方面,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

您也可以对 SortedDictionary 强制执行序数比较通过 StringComparer.Ordinal给构造函数:

Console.WriteLine(StringComparer.Ordinal.Compare(filename1, filename2) == 0); // false

关于c# - SortedDictionary 抛出带有两个不同条目的 "same key already exists",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59407269/

相关文章:

c# - JObject 包含一个 C# 关键字 - 如何访问它?

c# - .Net 扩展方法与实用程序类

c# - 易趣 API : How do I specify "Standard Shipping (FedEx Ground or FedEx Home Delivery®)" as a shipping service?

c# - DataAdapter 更新未正确将数据插入 SQL Server?

c# - 在 ASP.NET MVC (C#) 上提供静态文件

c# - 最小起订量和参数属性继承

c# - 在 c# Parallel.ForEach 中的 List.Add() 上出现 "Index out of bounds"错误

c# - XML 序列化命名空间

c# - 第二行代码在第一行之前执行 C#

c# - 如何避免两个 Controller 操作之间出现 AmbiguousMatchException?