对象与字典性能 .NET



我希望以属性名称-属性格式存储信息,我想知道我是否应该使用对象或字典。该对象允许我在值类型中具有灵活性,其中属性可能是年龄、姓名和国籍,并且具有不同类型的值,这使得字典不方便,并且需要大量调用 Convert.ToInt32。

另一方面,如果我将它们设置为对象,那么我将需要按名称访问属性,并且我还需要经常查找随机属性的名称。反思对系统来说是昂贵的,而且我对代表们没有运气。

性能是我的关键问题,存储 Propertyname-property 的两种方法似乎都有其缺点(字典只接受一种类型的变量作为值,并且对象需要反射(。

这将在一个迭代的循环中运行。欢迎替代解决方案

谢谢

我认为这没有任何竞争。你想要一个运行时关联数组 - 这是一个字典。

以下是我会怎么做:

public class Config
{
private Dictionary<Type, Dictionary<string, object>> _store
= new Dictionary<Type, Dictionary<string, object>>();
public void Store<T>(string key, T value)
{
if (!_store.ContainsKey(typeof(T)))
{
_store.Add(typeof(T), new Dictionary<string, object>());
}
_store[typeof(T)][key] = value;
}
public T Fetch<T>(string key)
{
return (T)_store[typeof(T)][key];
}
}

然后你可以编写以下代码:

var config = new Config();
config.Store<int>("Life", 42);
config.Store<string>("Hello", "World");
int x = config.Fetch<int>("Life");
string y = config.Fetch<string>("Hello");
Console.WriteLine(x);
Console.WriteLine(y);

输出:

42 世界

所有强类型,非常快。

当然,这是一个快速拼凑的课程。你需要确保你正确地充实它。当您缺少钥匙时,您应该如何处理这种情况?引发异常通常不是最好的主意。我至少会考虑实施public bool TryFetch<T>(string key, out T value)。那么你就不依赖于例外。

也许尝试以下方法:

public bool TryFetch<T>(string key, out T value)
{
var success = _store.ContainsKey(typeof(T)) && _store[typeof(T)].ContainsKey(key);
value = success ? this.Fetch<T>(key) : default(T);
return success;
}
public bool TryInject<T>(string key, Action<T> inject)
{
var success = this.TryFetch<T>(key, out T value);
if (success)
{
inject(value);
}
return success;
}   

最新更新