达网络 - dictionary.Keys.Add?(.net - dictionary.Keys

2019-08-18 00:55发布

在.NET中, IDictionary<K, V>定义.Keys.Values性能,其中的每一个是一个ICollection<>而不是IEnumerable<>这好像它是一个更自然适合我。

是否有任何合理的用例来调用.Add.Remove.Keys.Values一个实例的IDictionary<K, V>

Answer 1:

不,大概没有合理的使用情况。 这有所有极少数(可能为零)正当理由。

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"]);


Answer 2:

我想不出任何合理的用例的调用AddRemove的关键或收藏价值。 你会期望得到的字典中是什么样子?

我敢肯定,所有框架内置的实现IDictionary<K,V>将抛出一个NotSupportedException ,或类似的,如果你尝试这样做。 (你也许应该做任何你自己实现的同样的事情。)



文章来源: .net - dictionary.Keys.Add?