核心C#库中是否有任何可以为我提供不可变字典的东西?
Java的一些东西:
Collections.unmodifiableMap(myMap);
而且只是为了澄清,我不打算阻止键/值本身被改变,只是字典的结构.如果任何IDictionary的mutator方法被调用(Add, Remove, Clear
),我想要快速和大声失败的东西.
不,但包装器相当简单:
public class ReadOnlyDictionary: IDictionary { IDictionary _dict; public ReadOnlyDictionary(IDictionary backingDict) { _dict = backingDict; } public void Add(TKey key, TValue value) { throw new InvalidOperationException(); } public bool ContainsKey(TKey key) { return _dict.ContainsKey(key); } public ICollection Keys { get { return _dict.Keys; } } public bool Remove(TKey key) { throw new InvalidOperationException(); } public bool TryGetValue(TKey key, out TValue value) { return _dict.TryGetValue(key, out value); } public ICollection Values { get { return _dict.Values; } } public TValue this[TKey key] { get { return _dict[key]; } set { throw new InvalidOperationException(); } } public void Add(KeyValuePair item) { throw new InvalidOperationException(); } public void Clear() { throw new InvalidOperationException(); } public bool Contains(KeyValuePair item) { return _dict.Contains(item); } public void CopyTo(KeyValuePair [] array, int arrayIndex) { _dict.CopyTo(array, arrayIndex); } public int Count { get { return _dict.Count; } } public bool IsReadOnly { get { return true; } } public bool Remove(KeyValuePair item) { throw new InvalidOperationException(); } public IEnumerator > GetEnumerator() { return _dict.GetEnumerator(); } System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() { return ((System.Collections.IEnumerable)_dict).GetEnumerator(); } }
显然,如果要允许修改值,可以更改上面的[] setter.
据我所知,没有.但也许你可以从这些文章中复制一些代码(并学习很多):
C#中的不变性第一部分:C#中的不变性不可
变性第二部分:C#中一个简单的不可变堆栈
不变性:C#中协变不可变栈的
不变性第四部分:C#中一个不可变的队列
不变性:一个简单的二叉树
不可变性C#第七部分:关于二元树的更多信息
C#中的不变性第八部分:关于二元树的更多信息
C#中的不变性第九部分:学术界?加上我的AVL树实现
C#中的不可变性第10部分:一个双端队列
C#中的不可变性第十一部分:一个工作的双端队列
随着.NET 4.5的发布,有一个新的ReadOnlyDictionary类.您只需将IDictionary
构造函数传递给构造函数即可创建不可变字典.
这是一个有用的扩展方法,可用于简化创建只读字典.