Хранение делегатов в словаре

2

Я List<KeyValuePair<KeyEnum, Delegate> подписать делегатов на событие в List<KeyValuePair<KeyEnum, Delegate>

Цель состоит в том, чтобы связать ряд обработчиков с клавишами клавиатуры и именованными осями, которые представлены в Enums

Диспетчеризация довольно проста, я просто перебираю список KVP, проверяю условие и, если условие выполняется, просто member.Value; делегата с member.Value; Я не сталкивался с какими-либо проблемами, связанными с эффективностью процессорного времени, и обнаружил, что в стеке он значительно чище.

Проблема добавления в делегаты после создания экземпляра. Попытка получить к нему доступ с помощью collection.FirstOrDefault(n=>n.Key == KeyEnum.W).Value+= SomeMethod не работает, так как Value collection.FirstOrDefault(n=>n.Key == KeyEnum.W).Value+= SomeMethod только для чтения.

Есть ли способ сделать это, который не требует создания новой KeyValuePair каждый раз, или лучшее решение, чем KeyValuePair в целом

  • 2
    Почему бы не использовать Dictionary ?
  • 0
    @sweeper Словарь выглядел как пустая трата времени, так как я уже использую Enums, поиск происходит быстрее, не используя хеш-таблицу. Поскольку я намереваюсь выполнять около дюжины поисков в этом списке каждую секунду, я подумал, что словарь будет, по меньшей мере, неэффективен.
Показать ещё 1 комментарий
Теги:
linq
delegates
keyvaluepair

1 ответ

0
Лучший ответ

Просто используйте Dictionary<KeyEnum, Action>. Я не понимаю, зачем вам нужен последовательный доступ к KVP. Вы также должны указать тип делегата, соответствующий обработчикам событий, если можете. Action или EventHandler или Action<Something> зависимости от ваших потребностей.

Тогда вы можете легко добавить и вызвать делегатов:

// adding delegates
if (dictionary.ContainsKey(KeyEnum.W)) {
    dictionary[KeyEnum.W] += SomeMethod;
} else {
    dictionary.Add(KeyEnum.W, SomeMethod);
}

// calling delegates
if (dictionary.ContainsKey(KeyEnum.W)) {
    dictionary[KeyEnum.W](...);
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню