对象与字典性能 .NET
Object vs dictionary performance .NET
我希望以属性名称-属性格式存储信息,我想知道我应该使用对象还是字典。该对象允许我在值类型方面具有灵活性,其中属性可能是年龄、姓名和国籍,并且具有不同类型的值,这使得字典不方便并且需要大量调用 Convert.ToInt32。
另一方面,如果我将它们设为对象,那么我将需要通过名称访问属性,并且还需要经常查找随机属性的名称。反射对系统来说代价高昂,而且我对代表没有运气。
性能是我的关键问题,两种存储 Propertyname-属性 的方法似乎都有其缺点(字典只接受一种类型的变量作为值,而对象需要反射)。
这将 运行 进行多次迭代循环。欢迎替代解决方案
谢谢
我不认为这有任何竞争。您需要一个 运行 时间关联数组 - 那是一个字典。
以下是我的做法:
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
World
全部都是强类型且非常快。
当然,这是一个快速拼凑起来的class。您需要确保正确充实它。当您丢失钥匙时应该如何处理?抛出异常通常不是最好的主意。我至少会考虑实施 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;
}
我希望以属性名称-属性格式存储信息,我想知道我应该使用对象还是字典。该对象允许我在值类型方面具有灵活性,其中属性可能是年龄、姓名和国籍,并且具有不同类型的值,这使得字典不方便并且需要大量调用 Convert.ToInt32。
另一方面,如果我将它们设为对象,那么我将需要通过名称访问属性,并且还需要经常查找随机属性的名称。反射对系统来说代价高昂,而且我对代表没有运气。
性能是我的关键问题,两种存储 Propertyname-属性 的方法似乎都有其缺点(字典只接受一种类型的变量作为值,而对象需要反射)。
这将 运行 进行多次迭代循环。欢迎替代解决方案
谢谢
我不认为这有任何竞争。您需要一个 运行 时间关联数组 - 那是一个字典。
以下是我的做法:
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 World
全部都是强类型且非常快。
当然,这是一个快速拼凑起来的class。您需要确保正确充实它。当您丢失钥匙时应该如何处理?抛出异常通常不是最好的主意。我至少会考虑实施 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;
}