Dictionary和SortedDictionary的默认比较器获取方法是不同的
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。
引用
- ↑ A strange conflict of SortedDictionary keys · Issue #5078 · dotnet/core
- ↑ Dictionary<TKey,TValue>.Comparer Property (System.Collections.Generic) | Microsoft Docs
- ↑ SortedDictionary<TKey,TValue>.Comparer Property (System.Collections.Generic) | Microsoft Docs
- ↑ Ꞟ - 拉丁大寫字母volapuk ue: U+A79E - Unicode 字符百科