“Dictionary和SortedDictionary的默认比较器获取方法是不同的”的版本间的差异
(→类似的问题) |
|||
(未显示同一用户的3个中间版本) | |||
第5行: | 第5行: | ||
=== 类似的问题 === | === 类似的问题 === | ||
− | + | 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>." | 数据或键没有重复,为什么SortedDictionary会抛出ArgumentException "已存在具有相同键的条目。" "An element with the same key already exists in the SortedDictionary<TKey,TValue>." | ||
第15行: | 第15行: | ||
(此处省略一大堆前因) | (此处省略一大堆前因) | ||
− | 总之,我遇到了明明两个不一样的字符串以作为键Add到SortedDictionary中它会抛出。我尝试检查了很久,并且网上搜索也没有相关文章,所以我就把它提交到.Net Core的GitHub仓库的issues里去了<ref>[ | + | 总之,我遇到了明明两个不一样的字符串以作为键Add到SortedDictionary中它会抛出。我尝试检查了很久,并且网上搜索也没有相关文章,所以我就把它提交到.Net Core的GitHub仓库的issues里去了<ref>[https://github.com/dotnet/core/issues/5078 A strange conflict of SortedDictionary keys · Issue #5078 · dotnet/core]</ref>。 |
=== 解释 === | === 解释 === | ||
很快社区维护者给出了解答,我这里简要提炼并加工一下。 | 很快社区维护者给出了解答,我这里简要提炼并加工一下。 | ||
− | Dictionay获取默认的Comparer<ref>[ | + | Dictionay获取默认的Comparer<ref>[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]</ref>和SortedDictionary获取默认的Comparer<ref>[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]</ref>的方式是不一样的,总之Dictionary获取到的比较器是string.Equals,而SortedDictionary获取到的比较器是string.Compare,让两者比较"Ꞟ"(\ua79e)<ref>[https://unicode-table.com/cn/A79E/ Ꞟ - 拉丁大寫字母volapuk ue: U+A79E - Unicode 字符百科]</ref>和"\udb27"(没查到到底是干嘛用的字符),前者的结果是false也就是不相等,而后者的结果是0也就是相等。虽然\ua79e和\udb27的值不相等,但是在某些本地化(Culture)的判断下,他们是相等的。所以当你Add了"\ua79e"后再添加"\udb27"两者会被SortedDictionary所获取的string的默认的比较器string.Compare判定为一样的键,固然会引发异常。 |
=== 解决方法 === | === 解决方法 === | ||
− | 这位社区维护者给出了一个解决方法,那即是手动添加比较器StringComparer. | + | 这位社区维护者给出了一个解决方法,那即是手动添加比较器StringComparer.Ordinal,它同时适用于Dictionary和SortedDictionary。 |
== 引用 == | == 引用 == | ||
<references/> | <references/> |
2020年8月17日 (一) 03:03的最新版本
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 字符百科