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
引用
- ↑ ["https://github.com/dotnet/core/issues/5078" A strange conflict of SortedDictionary keys · Issue #5078 · dotnet/core]
- ↑ ["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]
- ↑ ["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]
- ↑ ["https://unicode-table.com/cn/A79E/" Ꞟ - 拉丁大寫字母volapuk ue: U+A79E - Unicode 字符百科]