“Dictionary和SortedDictionary的默认比较器获取方法是不同的”的版本间的差异

来自沃社Wiki
跳转至: 导航搜索
类似的问题
 
(未显示同一用户的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>."
 
数据或键没有重复,为什么SortedDictionary会抛出ArgumentException "已存在具有相同键的条目。" "An element with the same key already exists in the SortedDictionary<TKey,TValue>."
第15行: 第15行:
 
(此处省略一大堆前因)
 
(此处省略一大堆前因)
  
总之,我遇到了明明两个不一样的字符串以作为键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>。
+
总之,我遇到了明明两个不一样的字符串以作为键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>["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判定为一样的键,固然会引发异常。
+
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.Ordinal,它同时适用于Dictionary和SortedDictionary
+
这位社区维护者给出了一个解决方法,那即是手动添加比较器StringComparer.Ordinal,它同时适用于Dictionary和SortedDictionary。
  
 
== 引用 ==
 
== 引用 ==
 
<references/>
 
<references/>

2020年8月17日 (一) 03:03的最新版本

返回 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。

引用