c# - C# 4.0 中字典元素的 getter

标签 c# dictionary getter

我想实现一个字典,它仅在访问元素时(而不是提前)动态创建自己的元素。为此,我想使用 getter 方法,但我根本找不到任何有关如何在字典元素的上下文中声明 getter 的信息。

我确实了解如何向整个字典添加一个 getter(调用时必须返回一个字典),但我想做的是实现一个在访问字典中的单个元素时调用的 getter,这样我就可以即时创建该元素。该 getter 必须接收用于请求的键作为参数,并且它必须返回相应的值。

我在文档中找不到该任务的任何语法。

最佳答案

您只需要在 Dictionary<,> 上重新实现索引器

    public class MyDictionary<TKey, TValue> : Dictionary<TKey, TValue>
{
    public new TValue this[TKey key]
    {
        get
        {
            TValue value;
            if (!TryGetValue(key, out value))
            {
                value = Activator.CreateInstance<TValue>();
                Add(key, value);
            }
            return value;
        }
        set { base[key] = value; }
    } 
}

如果需要更复杂的值实例化,可以使用激活器函数

 public class MyDictionary<TKey, TValue> : Dictionary<TKey, TValue>
{
    readonly Func<TKey, TValue> _activator;

    public MyDictionary(Func<TKey, TValue> activator)
    {
        _activator = activator;
    }

    public new TValue this[TKey key]
    {
        get
        {
            TValue value;
            if (!TryGetValue(key, out value))
            {
                value = _activator(key);
                Add(key, value);
            }
            return value;
        }
        set { base[key] = value; }
    } 
}

用法:

static void Main(string[] args)
{
    var dict = new MyDictionary<int, string>(x => string.Format("Automatically created Value for key {0}", x));
    dict[1] = "Value for key 1";
    for (int i = 0; i < 3; i++)
    {
        Console.WriteLine(dict[i]);
    }
    Console.Read();
}

关于c# - C# 4.0 中字典元素的 getter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8972023/

相关文章:

python - 保存/加载字典,同时保留键的数据类型

javascript - 动态更新对象中的 Getter 函数

Java:从另一个类调用实例化 getter 返回 null

oop - matlab getter/setter 方法。为什么他们让我的程序 super 慢?

c# - if() 语句中的可为空的 bool - 需要检查吗?

c# - 在 C# 中更改资源处理程序 header 中的名称

带名字的 JavaScript 字典

c# - .Net Core - 将 API 中间件中的依赖项 IUserInfo 注入(inject)到存储库层

c# - NHibernate SaveOrUpdate 子集合未使用标识 ID 更新

python - 垂直打印列表字典