在.NET中, IDictionary<K, V>
定义.Keys
和.Values
性能,其中的每一个是一个ICollection<>
而不是IEnumerable<>
这好像它是一个更自然适合我。
是否有任何合理的用例来调用.Add
或.Remove
上.Keys
或.Values
一个实例的IDictionary<K, V>
在.NET中, IDictionary<K, V>
定义.Keys
和.Values
性能,其中的每一个是一个ICollection<>
而不是IEnumerable<>
这好像它是一个更自然适合我。
是否有任何合理的用例来调用.Add
或.Remove
上.Keys
或.Values
一个实例的IDictionary<K, V>
不,大概没有合理的使用情况。 这有所有极少数(可能为零)正当理由。
的Dictionary<TKey, TValue>
类返回KeyCollection
其.Keys
这又引发NotSupportedException
与“突变从字典派生的密钥集合是不允许的。” 每当试图直接添加到它。 我想,它返回一个ICollection
遗留原因,而且也应该不惜一切代价,现在是可以避免的。
事实上,除非ICollection
返回从.Keys
不得不将包含一个参考IDictionary
,我看不出任何有用的东西发生。 的.Add
的的ICollection
将不得不告诉含有IDictionary
这是什么意思加。 也许你想实现某种形式的Set
,你可以做这样的事情:
public class StringSet : IDictionary<string, int> {
private readonly Dictionary<string, int> _InternalDictionary = new Dictionary<string, int>();
public int this[string key] {
get { return _InternalDictionary[key]; }
set { _InternalDictionary[key] = value; }
}
private StringCollection _Keys;
public ICollection<string> Keys {
get {
if(_Keys == null) _Keys = new StringCollection(this);
return _Keys;
}
}
ICollection<string> IDictionary<string, int>.Keys {
get {
if(_Keys == null) _Keys = new StringCollection(this);
return _Keys;
}
}
public ICollection<int> Values { get { throw new NotImplementedException();} }
public void Add(string key, int value) { _InternalDictionary.Add(key, value); }
public bool ContainsKey(string key) { return _InternalDictionary.ContainsKey(key); }
public bool Remove(string key) { return _InternalDictionary.Remove(key); }
public bool TryGetValue(string key, out int value) { return _InternalDictionary.TryGetValue(key, out value); }
public void Clear() { throw new NotImplementedException(); }
public void Add(KeyValuePair<string, int> item) { throw new NotImplementedException(); }
public bool Contains(KeyValuePair<string, int> item) { throw new NotImplementedException(); }
public void CopyTo(KeyValuePair<string, int>[] array, int arrayIndex) { throw new NotImplementedException(); }
public bool Remove(KeyValuePair<string, int> item) { throw new NotImplementedException(); }
public int Count { get { return _InternalDictionary.Count; } }
public bool IsReadOnly { get { return false; } }
public IEnumerator<KeyValuePair<string, int>> GetEnumerator() { throw new NotImplementedException(); }
IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); }
}
public class StringCollection : ICollection<string> {
private readonly StringSet _ContainingSet;
public StringCollection(StringSet set) {
_ContainingSet = set;
}
public void Add(string item) {
if(_ContainingSet.ContainsKey(item)) _ContainingSet[item]++;
else _ContainingSet[item] = 1;
}
public bool Contains(string item) { return _ContainingSet.ContainsKey(item); }
public bool Remove(string item) { throw new NotImplementedException(); }
public void Clear() { throw new NotImplementedException(); }
public void CopyTo(string[] array, int arrayIndex) { throw new NotImplementedException(); }
public int Count { get { return _ContainingSet.Count; } }
public bool IsReadOnly { get { return false; } }
public IEnumerator<string> GetEnumerator() { throw new NotImplementedException(); }
IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); }
}
当然还有实现这个或者类似的针对您的具体需要一种更好的方式。 这样做的唯一好处是允许.Add
对返回Keys
StringCollection
。 我想迫使人们使用我StringSet
使用父StringSet
反正类。 但是,它可能有人会想上面覆盖的行为。
与此调用它:
var set = new StringSet();
var keys = set.Keys;
keys.Add("hello");
keys.Add("hello");
keys.Add("world");
Debug.Print("hello: {0}, world: {1}", set["hello"], set["world"]);
我想不出任何合理的用例的调用Add
或Remove
的关键或收藏价值。 你会期望得到的字典中是什么样子?
我敢肯定,所有框架内置的实现IDictionary<K,V>
将抛出一个NotSupportedException
,或类似的,如果你尝试这样做。 (你也许应该做任何你自己实现的同样的事情。)