Как хранить объекты данных, которые используют 2 ключа для поиска значения - PullRequest
1 голос
/ 13 июля 2020

Мне нужно t ie 3 типа вещей вместе:

  1. перечисление (состояние)
  2. другое перечисление (тип функции)
  3. a ссылка на функцию.

Контекст моего проекта состоит в том, что у меня есть конечный автомат видеоигры, существующий в одном классе. У меня есть несколько операторов switch, которые я пытаюсь заменить. Каждое состояние имеет набор связанных с ним функций, таких как Enter () и Exit ().

На английском языке sh я хочу сказать: «для состояния ___ вызовите функцию типа ___» и затем он вызывает фактическую функцию. Например, я хотел бы сделать что-то вроде этого:

Lookup [states.attacking] [stateFunctions.enter];

, где это вернет вызов «void Attacking_Enter ()»

Ответы [ 3 ]

2 голосов
/ 13 июля 2020

Вы можете использовать

Dictionary<states, Dictionary<stateFunctions, Action>> Lookup = new Dictionary<states, Dictionary<stateFunctions, Action>>();

, чтобы вы могли искать и выполнять, например,

// First Key finds the inner dictionary
// Second key finds the action in the inner dictionary
// ? makes sure you don't get NullReferenceExceptions (just in case)
// Invoke() finally executed the stored action
Lookup[states.enter][stateFunctions.attack]?.Invoke();

Будьте осторожны при заполнении: Обязательно инициализируйте внутренние Dictionary (s) перед добавлением к ним элементов, например,

Lookup[states.enter] = new Dictionary<stateFunctions, Action>();
Lookup[states.enter][stateFunctions.attack] = Attacking_Enter;

Или инициализируйте их все в одном go например, например

private void Initialize ()
{
    Lookup = new Dictionary<states, Dictionary<stateFunctions, Action>>
    {
        {states.enter, new Dictionary<stateFunctions, Action>
                       { 
                           {stateFunctions.attack, Attacking_Enter}, 
                           ...
                       }
        },
        ...
    }     
}
0 голосов
/ 13 июля 2020

Вы можете попробовать Кортеж

var dict = new Dictionary<Tuple<T1, T2>, T3>();

Или объект класса, который реализует GetHashCode при необходимости

var dict = new Dictionary<ClassObj, T3>();
0 голосов
/ 13 июля 2020
 var dict = Dictionary<Dictioanry<T1, T2>, T3>();

где T1, T2 и T3 - желаемые типы данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...