对象与字典性能 .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;
    }