1

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

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

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

}

此类向客户端公开,我希望客户端能够修改 中现有键的值Underlyings,但不向Underlyings.

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

4

4 回答 4

1

您可以使用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;
于 2016-05-20T09:30:59.047 回答
1

不,没有只允许更新的标准字典。它的全部或全部。

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

于 2016-05-20T09:13:54.073 回答
0

不是一个好方法,而是一个黑客。围绕您的数据生成一个包装器,并使用.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
于 2016-05-20T09:28:56.667 回答
0

正如您所说,在字典上创建一个包装器或从字典类继承一个覆盖添加。

于 2016-05-20T09:23:33.097 回答