Dictionary和SortedDictionary的默认比较器获取方法是不同的

来自沃社Wiki
Orange233讨论 | 贡献2020年8月16日 (日) 19:39的版本
跳转至: 导航搜索

返回 Orange233

Dictionary和SortedDictionary的默认比较器获取方法是不同的

类似的问题

SortedDictionary出现莫名其妙的键重复异常:ArgumentException "已存在具有相同键的条目。" "An element with the same key already exists in the SortedDictionary<TKey,TValue>."

数据或键没有重复,为什么SortedDictionary会抛出ArgumentException "已存在具有相同键的条目。" "An element with the same key already exists in the SortedDictionary<TKey,TValue>."

Dictionary和SortedDictionary的对string的比较方法方法不同

上下文

(此处省略一大堆前因)

总之,我遇到了明明两个不一样的字符串以作为键Add到SortedDictionary中它会抛出。我尝试检查了很久,并且网上搜索也没有相关文章,所以我就把它提交到.Net Core的GitHub仓库的issues里去了[1]

解释

很快社区大佬给了解答,我这里简要提炼并加工一下。 Dictionay获取默认的Comparer[2]和SortedDictionary获取默认的Comparer[3]的方式是不一样的,总之Dictionary获取到的比较器是string.Equals,而SortedDictionary获取到的比较器是string.Compare,让两者比较"Ꞟ"(\ua79e)[4]和"\udb27"(没查到到底是干嘛用的字符),前者的结果是false也就是不相等,而后者的结果是0也就是相等。虽然\ua79e和\udb27的值不相等,但是在某些本地化(Culture)的判断下,他们是相等的。所以当你Add了"\ua79e"后再添加"\udb27"两者会被SortedDictionary所获取的string的默认的比较器string.Compare判定为一样的键,固然会引发异常。

解决方法

这位社区维护者给出了一个解决方法,那即是手动添加比较器StringComparer.Ordinal,它同时适用于Dictionary和SortedDictionary

引用

  1. ["https://github.com/dotnet/core/issues/5078" A strange conflict of SortedDictionary keys · Issue #5078 · dotnet/core]
  2. ["https://docs.microsoft.com/en-us/dotnet/api/system.collections.generic.dictionary-2.comparer?view=netcore-3.1#remarks" Dictionary<TKey,TValue>.Comparer Property (System.Collections.Generic) | Microsoft Docs]
  3. ["https://docs.microsoft.com/en-US/dotnet/api/system.collections.generic.sorteddictionary-2.comparer?view=netcore-3.1#remarks" SortedDictionary<TKey,TValue>.Comparer Property (System.Collections.Generic) | Microsoft Docs]
  4. ["https://unicode-table.com/cn/A79E/" Ꞟ - 拉丁大寫字母volapuk ue: U+A79E - Unicode 字符百科]