Объект против производительности словаря .NET - PullRequest
0 голосов
/ 03 июля 2018

Я хочу хранить информацию в формате имя-свойства-свойства, и мне было интересно, должен ли я использовать объект или словарь. Объект предоставляет мне гибкость в типах значений, где свойствами могут быть возраст, имя и национальность, а также значения, различающиеся по типу, что делает словари неудобными и требует большого количества вызовов Convert.ToInt32.

С другой стороны, если я сделаю их объектами, мне нужно будет обращаться к свойствам по именам, а также мне нужно будет часто находить имена случайных свойств. Отражение дорого обходится системе, и мне не повезло с делегатами.

Производительность - моя ключевая проблема, и оба способа хранения Propertyname-свойства, похоже, имеют свои недостатки (со словарем, принимающим в качестве значения только один тип переменной, и объектом, требующим отражения).

Это будет выполняться в многократно повторенном цикле. Альтернативные решения приветствуются

Спасибо

1 Ответ

0 голосов
/ 03 июля 2018

Я не думаю, что за это есть конкуренция. Вы хотите ассоциативный массив времени выполнения - это словарь.

Вот как бы я это сделал:

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

Все строго напечатано и очень быстро.

Конечно, это быстро собираемый класс. Тебе нужно убедиться, что ты правильно излагаешь это. Как вы должны справиться с ситуацией, когда у вас есть недостающие ключи? Бросать исключение, как правило, не лучшая идея. Я бы посмотрел на реализацию 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;
    }   
...