Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 定义C类类型实例(如字典)后更改其属性_C#_Oop_Dictionary - Fatal编程技术网

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想要的东西在不重新创建字典的情况下是不可能的。