【问题标题】:Object vs dictionary performance .NET对象与字典性能 .NET
【发布时间】:2018-07-02 23:41:23
【问题描述】:

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

另一方面,如果我将它们设为对象,那么我将需要通过名称访问属性,并且我还需要经常查找随机属性的名称。反射对系统来说代价高昂,而且我在委托方面没有运气。

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

这将在一个多次迭代的循环中运行。欢迎使用其他解决方案

谢谢

【问题讨论】:

  • 这似乎有点奇怪。字典旨在完全按照您的意愿行事。对象不是。你想要一个运行时关联数组——那就是字典。
  • “字典只接受一种类型的变量作为值和需要反射的对象”——这听起来不对。如果字典的值为object,那么您可以存储所有内容。此外,使用Dictionary<Type, Dictionary<string, object>> 提供强类型、基于键的查找也不难。

标签: .net dictionary object system.reflection


【解决方案1】:

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

我会这样做:

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&lt;T&gt;(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;
    }   

【讨论】:

  • 非常感谢您抽出宝贵时间解决我的问题。我不知道这种机制的存在,并将研究您的答案,实施它,并希望获得最佳性能。
  • @ConfusedSoul - 什么机制?
  • 我的意思是像这样操作字典。但是问题:这不涉及演员表:“return (T)_store[typeof(T)][key];”这会降低性能?此外,与更简单的 dic 相比,这个实现的配置类是否有性能优势?
  • 它在 IL 中创建一个 unbox.any 调用。这几乎不是什么。这是最快的操作之一。
猜你喜欢
  • 1970-01-01
  • 2017-06-17
  • 1970-01-01
  • 2012-02-09
  • 1970-01-01
  • 2011-07-06
  • 1970-01-01
  • 1970-01-01
  • 2010-10-05
相关资源
最近更新 更多