【问题标题】:Is there an easy way to have a dictionary-like object that cannot be added to, but whose values can be modified?有没有一种简单的方法可以拥有一个无法添加但可以修改其值的类字典对象?
【发布时间】:2016-09-17 11:29:15
【问题描述】:

假设我有一个类Composite,它由仪器和重量的字典构成。

public IReadOnlyDictionary<Instrument, double> Underlyings{ get; private set; } 

public Composite(
    Id id,
    Currency currency,
    Dictionary<Instrument, double> underlyings
    )
{
    Underlyings= underlyings;
}

}

这个类暴露给客户端,我希望客户端能够修改Underlyings中现有的键值,但不向Underlyings添加新的键值对。

然后将Underlyings 设置为ReadOnlyDictionary 将不起作用,因为客户端代码将无法修改现有键的值。所以我的解决方案是使用来自this answer 的字典的包装器并修改TValue IDictionary&lt;TKey, TValue&gt;.this[TKey key] 的设置器,以便可以修改现有值。但这似乎是一个愚蠢的解决方案 - 有没有比编写包装类更简单的方法来拥有一个字典,该字典具有可修改的现有键值对,但不能添加新的键值对?为这个非常简单的问题道歉。

【问题讨论】:

  • @Damien_The_Unbeliever 抱歉,如果我误解了您的建议,但我认为属性不会起作用,因为 Composite 只是仪器的集合,它们本身没有重量。重量只属于复合材料本身。每个工具的权重必须一直重新平衡(或更改),但它们并不是工具本身的固有属性 - 它们仅存在于该组合的上下文中。并且有数百种不同的复合材料。如果这有任何意义?

标签: c# .net dictionary readonly readonly-collection


【解决方案1】:

不,没有只允许更新的标准字典。要么全有,要么全无。

正如您所发现的,您必须自己创建它,或者找到已经存在的实现。覆盖 Addthis[] 属性是一种可能适合您的解决方案。

【讨论】:

    【解决方案2】:

    您可以使用ReadOnlyDictionary,但提供另一种方法来修改给定键的值。比如:

    Dictionary<KeyType, ValueType> _dictionary;
    public ReadOnlyDictionary<KeyType, ValueType> Dictionary => new ReadOnlyDictionary<KeyType, ValueType>(_dictionary);
    
    public void ChangeValue(KeyType key, ValueType value) => _dictionary[key].Value = value;
    

    【讨论】:

      【解决方案3】:

      如你所说,在字典上创建一个包装器或从字典类继承一个覆盖 Add。

      【讨论】:

        【解决方案4】:

        不是一个好方法,而是一个 hack。 围绕您的数据生成一个包装器并使用 .NET 4.5 中引入的 ReadOnlyDictionary

        class MyDataWrapper<T>
        {
            public T Data { set; get; }
        }
        

        var dicData = new Dictionary<int, MyDataWrapper<string>>();
        dicData[0] = new MyDataWrapper<string> { Data = "0" };
        dicData[1] = new MyDataWrapper<string> { Data = "0" };
        var myDic = new ReadOnlyDictionary<int, MyDataWrapper<string>>(dic);
        
        myDic[1].Data = "2";
        
        // myDic[1] = new ... compile error
        // myDic.Add() compile error
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-02-25
          • 2011-02-04
          • 2020-01-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多