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