0

I can set a dictionary to ignore case when comparing, during instantiation:

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

How do I set StringComparer.InvariantCultureIgnoreCase after the dictionary has already been instantiated?

4

3 回答 3

3

通过重新创建它...

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

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

于 2013-09-13T19:33:23.137 回答
3

你不能。

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

这是必要的,原因如下:

  • 使用新的比较器,一些键可能被认为是相等的,需要合并
  • 需要为每个现有密钥计算新的哈希值,以便将来使用新比较器创建的哈希值能够找到旧密钥。
于 2013-09-13T19:33:37.253 回答
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
}
于 2013-09-13T19:40:34.817 回答