"More functional" "accessor" 对于 C# 中的集合

"More functional" "accessor" for collections in C#

现在我有一个合集:Dictionary<string, List<string>> dictionary

出于某种原因,现在我想 "project/map" 它的一部分到其他集合,有点像将它用作支持字段,并为此集合创建不同的访问器。

比如List<string> keys对应本字典的键,或者Dictionary<string, string> firstItems对应一个字典,使用源字典的键作为键,源字典中值的第一项作为值。

这可以通过在 keysfirstItems 的 getter/setter 中添加行为来部分完成。当我们调用 keys 时,我们从 dictionary 获取密钥;或者当我们调用 keys = whateverTheListIs 时,dictionary 也可能会按照设计执行某些行为。

但是我也想有一个"more functional""accessor",比如我们调用firstItems.Add(aString, anotherString)的时候,我们也给dictionary加了一个入口;或者当我们调用 keys.Remove(yetAnotherString) 时,我们删除 dictionary 中的条目。

他们有办法让我做到吗?

编辑:

场景如下(当然你可以改,只是为了说明):

public class Projection
{
  private Dictionary<string, List<string>> dictionary; //"backing field"

  public List<string> keys;
  public Dictionary<string, string> firstItems;
}

public static void DoSomething()
{
  Projection projection = new Projection();
  //Supposed to modify projection.dictionary too
  projection.keys = new List<string>();
  projection.keys.Add("A new Key");
}

您可以通过继承创建自己的 Dictionary :

class CustomDictionary<TKey,TValue> : IDictionary<TKey, TValue>
{
    // Implement the interface IDictionary here

    public void Add(KeyValuePair<TKey, TValue> item)
    {
        // create your logic
    }
}

你可以使用组合:

class CustomDictionary<TKey,TValue>
{
    private Dictionary<TKey,TValue> _dictionary;

    public void Add(KeyValuePair<TKey, TValue> item)
    {
        // create your logic
        _dictionary.Add();
    }
}

我最喜欢的方式,你可以同时使用:

class CustomDictionary<TKey,TValue> : IDictionary<TKey,TValue>
{
    private Dictionary<TKey,TValue> _dictionary;

    // Implement the interface IDictionary here
    // send the logic to your private Dictionary

    public void Add(KeyValuePair<TKey, TValue> item)
    {
         // create your logic
        _dictionary.Add(item.Key, item.Value);
    }
}

如果想直接继承Dictionary,就会遇到问题。您不能覆盖 Add() 方法,因为它不是 virtual 方法。一种解决方案是使用关键字 new.

隐藏它
class CustomDictionary<TKey, TValue> : Dictionary<TKey, TValue>
{
    public new void Add(TKey key, TValue value)
    {
        // create your logic
        base.Add(key, value);
    }

    public void Add(KeyValuePair<TKey, TValue> item)
    {
        this.Add(item.Key, item.Value);
    }
}