在定义之后更改C#类类型实例(例如字典)的属性

时间:2013-09-13 19:32:19

标签: c# oop dictionary

在实例化期间,我可以将字典设置为在比较时忽略大小写:

 Dictionary<string, long> SomeDict=new Dictionary<string, long>(StringComparer.InvariantCultureIgnoreCase);

如何在字典实例化后设置StringComparer.InvariantCultureIgnoreCase?

3 个答案:

答案 0 :(得分:3)

通过重新创建它......

SomeDict = new Dictionary<string, long>(SomeDict, 
                                        StringComparer.InvariantCultureIgnoreCase);

最后,您想要的更改过于激进(项目的所有哈希值都可能会发生变化。只有“可能”因为如果密钥全部采用"123"形式,"456"哈希将保持不变,但在这里我们说的是一般情况)。字典必须清理和重新填充,因此几乎从头开始重新创建。

答案 1 :(得分:3)

你做不到。

您可以做的最好的事情是使用新的比较器创建一个新字典并复制所有值。

由于以下几个原因,这是必要的:

  • 使用新的比较器可能会认为某些键是相同的,需要合并
  • 需要为每个现有密钥计算新的哈希值,以便将来使用新的比较器创建的哈希值能够找到旧密钥。

答案 2 :(得分:1)

我必须同意你必须重新创建字典的其他解决方案,如果它更容易使它看起来好像可以修改,你可以创建一个隐藏字典的类娱乐:

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
}