C# 定义C类类型实例(如字典)后更改其属性
在实例化过程中,我可以将字典设置为在比较时忽略大小写:C# 定义C类类型实例(如字典)后更改其属性,c#,oop,dictionary,C#,Oop,Dictionary,在实例化过程中,我可以将字典设置为在比较时忽略大小写: Dictionary<string, long> SomeDict=new Dictionary<string, long>(StringComparer.InvariantCultureIgnoreCase); 在字典已经实例化之后,如何设置StringComparer.InvariantCultureInoRecase?通过重新创建它 SomeDict = new Dictionary<string,
Dictionary<string, long> SomeDict=new Dictionary<string, long>(StringComparer.InvariantCultureIgnoreCase);
在字典已经实例化之后,如何设置StringComparer.InvariantCultureInoRecase?通过重新创建它
SomeDict = new Dictionary<string, long>(SomeDict,
StringComparer.InvariantCultureIgnoreCase);
最后,您想要的更改过于激进,所有项的哈希值都可能会更改。可能只是因为如果键都是123、456的形式,散列将保持不变,但这里我们讨论的是一般情况。字典需要清理和重新填充,因此几乎从头开始重新创建。你不能
你能做的最好的事情就是用一个新的比较器创建一个新的字典,然后把所有的值都复制过来
这是必要的,原因如下:
使用新的比较器,一些键可能被认为是相等的,需要合并
需要为每个现有密钥计算新的哈希,以便将来使用新比较器创建的哈希能够找到旧密钥。
我必须同意您必须重新创建字典的其他解决方案,但是如果更容易使它看起来像是可修改的,您可以创建一个隐藏字典的类:
public class MyDictionary<TKey, TValue> : IDictionary<TKey, TValue>
{
private Dictionary<TKey, TValue> _dict;
public IEqualityComparer<TKey> Comparer
{
get
{
return _dict.Comparer;
}
set
{
_dict = new Dictionary<TKey, TValue>(_dict, value);
}
}
// constructors and IDictionary implementations, mirroring _dict
}
这是唯一的方法吗?还是可以在不重新实例化的情况下显式更改对象的此属性?@last阅读添加的文本。不,不可能。@lastPredium:我认为事后如果不重新创建它,它是无法改变的。比较器是只读属性。我想你也许可以通过反射来检查它的内部结构并对其进行修改,但我建议不要这样做。此外,考虑一种新的比较选项使现有字典条目无效的场景。这需要检查,这在创建字典时发生。@David您可以通过实现自己的比较器轻松解决前者,它支持在内部不同比较器之间切换。最大的问题是你的第二点——比较器的契约是,无论是现在还是将来,比较两个元素都会产生相同的结果。改变比较的工作方式会破坏契约,这就是为什么OP想要的东西在不重新创建字典的情况下是不可能的。