我知道如何使用下面的代码使新的字典不敏感:
var caseInsensitiveDictionary = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
但是我正在使用WebApi将JSON对象序列化为我们创建的类。
public class Notification : Common
{
public Notification();
[JsonProperty("substitutionStrings")]
public Dictionary<string, string> SubstitutionStrings { get; set; }
}
因此,除了在收到“Notification”对象后重建字典之外,有没有办法将该字典设置为首先不区分大小写或者在创建之后?
由于
答案 0 :(得分:4)
不,这是不可能的。您需要创建一个新词典。因此,除了在收到&#34; Notification&#34;之后重建字典。对象,有没有办法将这个字典设置为不区分大小写,或者在它创建之后?
目前,字典中包含各种不同存储桶中的所有密钥;改变比较器意味着一堆钥匙都会突然出现在错误的桶中。您需要遍历每个密钥并重新计算它需要去的位置并移动它,这与创建新字典的工作量基本相同。
答案 1 :(得分:1)
每当将项添加到字典中时,字典将计算其哈希码并记下它。每当要求字典查找项目时,字典将计算正在搜索的项目的哈希码,并假设字典中返回不同哈希码的任何项目都不可能与其匹配,因此无需检查。
为了使字典能够考虑&#34; FOO&#34;,&#34; foo&#34;和&#34; Foo&#34;如果相同,它使用的哈希码函数必须为所有这些函数生成相同的值。如果使用哈希函数构建字典,该函数返回&#34; FOO&#34;,&#34; foo&#34;和&#34; Foo&#34;的不同值,则更改为产生哈希函数的哈希函数所有三个字符串的相同值将要求字典重新评估其中包含的每个项目的哈希值。这样做需要几乎与从头开始构建新字典一样多的工作,因此.NET不支持任何更改与字典关联的散列函数的方法,除了将旧字典中的所有项复制到新字典之外放弃旧的。
请注意,可以设计SwitchablyCaseSensitiveComparator
GetHashCode()
方法始终返回不区分大小写的哈希值,但其Equals
方法可以在区分大小写和非大小写之间切换敏感的操作。如果要实现这样的事情,可以将项添加到字典中,然后在区分大小写和不区分大小写的模式之间切换。这样做的最大问题是,当添加两个项目时,如果字典处于区分大小写模式,仅在大小写不同的情况下添加字典,当字典处于不区分大小写模式时尝试检索其中任何一个项目可能不会表现为预期。如果在不区分大小写的模式下填充字典并在区分大小写模式下执行某些查找应该是相对安全的。
答案 2 :(得分:1)
您确实必须重新创建字典,但这可以通过扩展来完成:
public static class extensions
{
public static Dictionary<string, T> MakeCI<T>(this Dictionary<string, T> dictionary)
{
return dictionary.ToDictionary(kvp => kvp.Key, kvp => kvp.Value, StringComparer.OrdinalIgnoreCase);
}
}
我已经为键指定了字符串类型,因为这就是我们想要的CI,但是值可以是任何类型。
您将这样使用它:
myDict = myDict.MakeCI();
答案 3 :(得分:0)
尝试将您的班级定义更改为此类
public class Notification : Common
{
public Notification()
{
this.substitutionStringsBackingStore =
new Dictionary<string,string>( StringComparer.OrdinalIgnoreCase )
;
}
[JsonProperty("substitutionStrings")]
public Dictionary<string, string> SubstitutionStrings
{
get { return substitutionStringsBackingStore ; }
set { substitutionStringsBackingStore = value ; }
}
private Dictionary<string,string> substitutionStringsBackingStore ;
}