Структура данных в C # для эмуляции кортежа Python из кортежей - PullRequest
0 голосов
/ 27 февраля 2012

У меня есть данные в Python о кортеже кортежей.Например:

STATES = (
    (0, 'NO RUN ALLOWED'),
    (1, 'STOPPED'),
    (2, 'READY FOR RESTART'),
    (3, 'END NEXT GAME'),
    (4, 'RUNNING'),
)

Я понимаю, что доступ к кортежу в Python - это O (1), и я хочу получить что-то подобное в C #.Я уже думаю в словаре, но я также думаю, что это может быть вредным с точки зрения производительности.Есть идеи?

Ответы [ 5 ]

5 голосов
/ 27 февраля 2012

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

public enum States
{
    NotSet, // Good design to consider 0 as an error condition!
    NoRunAllowed,
    Stopped,
    ReadyForRestart,
    EndNextGame,
    Running
}

Поскольку enum по умолчанию инициализируется в 0, предлагается считать это недопустимым состоянием. Кроме того, Enum.HasFlag всегда возвращает true, когда значение для проверки равно 0, когда Enum используется для флагов (см. FlagsAttribute ).

Также обычно используется атрибут DescriptionAttribute для применения удобочитаемого имени к отдельным опциям перечисления для отображения в пользовательском интерфейсе.

2 голосов
/ 27 февраля 2012

А как насчет простого строкового массива?

var states = new[]
{
    "NO RUN ALLOWED",
    "STOPPED",
    "READY FOR RESTART",
    "END NEXT GAME",
    "RUNNING"
};
2 голосов
/ 27 февраля 2012

Словарь звучит так, как будто он будет работать нормально, и не стоит беспокоиться о скорости:

http://msdn.microsoft.com/en-us/library/xfhwa508.aspx

Универсальный класс Dictionary обеспечивает сопоставление из набора ключейк набору значений.Каждое дополнение к словарю состоит из значения и связанного с ним ключа.Извлечение значения с использованием его ключа выполняется очень быстро, близко к O (1), поскольку класс Dictionary реализован в виде хеш-таблицы

public enum GameStates
{
    UnknownState = 0,
    NoRunningAllowed,
    Stopped,
    ReadyForRestart,
    EndNextGame,
    Running
}
///...other stuff...
var GameStateList = new Dictionary<GameStates,string>();
GameStateList.Add(GameStates.NoRunningAllowed,"NO RUN ALLOWED");
GameStateList.Add(GameStates.Stopped,"STOPPED");
GameStateList.Add(GameStates.ReadyForRestart,"READY FOR RESTART");
GameStateList.Add(GameStates.EndNextGame,"END NEXT GAME");
GameStateList.Add(GameStates.Running,"RUNNING");

string debugMessageForCurrentState = GateStateList[MyCurrentGameState];
1 голос
/ 27 февраля 2012

Из документации (выделено мной):

Универсальный класс Dictionary (Of TKey, TValue) обеспечивает отображение набора ключей на набор значений.Каждое дополнение к словарю состоит из значения и связанного с ним ключа.Извлечение значения с использованием его ключа выполняется очень быстро, близко к O (1) , поскольку класс Dictionary (Of TKey, TValue) реализован в виде хеш-таблицы.

1 голос
/ 27 февраля 2012

Доступ к кортежу по индексу может быть O (1), но поиск значения в коллекции или кортеже не будет O (1) (если вы уже не знаете индекс). В вашем примере, если в будущих версиях вы удалите State 2, каждому потребителю может потребоваться редизайн. Словарь позволяет искать в коллекции ключ на O (1).

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