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

本文关键字:属性 字典 类型 实例 定义 | 更新日期: 2023-09-27 18:31:24

我可以设置一个字典,以便在实例化期间进行比较时忽略大小写:

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

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

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

你不能。

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

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

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

通过重新创建它...

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
}