有没有一种简单的方法可以拥有一个无法添加但可以修改其值的类字典对象?
Posted
技术标签:
【中文标题】有没有一种简单的方法可以拥有一个无法添加但可以修改其值的类字典对象?【英文标题】: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<TKey, TValue>.this[TKey key]
的设置器,以便可以修改现有值。但这似乎是一个愚蠢的解决方案 - 有没有比编写包装类更简单的方法来拥有一个字典,该字典具有可修改的现有键值对,但不能添加新的键值对?为这个非常简单的问题道歉。
【问题讨论】:
@Damien_The_Unbeliever 抱歉,如果我误解了您的建议,但我认为属性不会起作用,因为 Composite 只是仪器的集合,它们本身没有重量。重量只属于复合材料本身。每个工具的权重必须一直重新平衡(或更改),但它们并不是工具本身的固有属性 - 它们仅存在于该组合的上下文中。并且有数百种不同的复合材料。如果这有任何意义? 【参考方案1】:不,没有只允许更新的标准字典。要么全有,要么全无。
正如您所发现的,您必须自己创建它,或者找到已经存在的实现。覆盖 Add
和 this[]
属性是一种可能适合您的解决方案。
【讨论】:
【参考方案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
【讨论】:
以上是关于有没有一种简单的方法可以拥有一个无法添加但可以修改其值的类字典对象?的主要内容,如果未能解决你的问题,请参考以下文章
有没有一种简单的方法可以在 ggplot2 中单独调整文本标签?
有没有一种简单的方法可以在没有图像的情况下为 Kivy 标签、按钮、小部件等添加边框?