我想实现一个字典,它仅在访问元素时(而不是提前)动态创建自己的元素。为此,我想使用 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/