C#中用于模拟Python元组的数据结构

本文关键字:元组 数据结构 Python 模拟 用于 | 更新日期: 2023-09-27 18:26:01

我在Python中有一个元组元组上的数据。例如:

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

我知道Python中的元组访问是O(1),我想在C#中获得类似的东西。我已经在字典里思考了,但我也认为它可能对性能有害。知道吗?

C#中用于模拟Python元组的数据结构

如果您关心应用程序状态,最好使用enum

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

默认情况下,枚举初始化为0,因此建议将其视为无效状态。此外,当要测试的值为0时,当Enum用于标志时,Enum.HasFlag总是返回true(请参见FlagsAttribute)。

使用DescriptionAttribute将人类可读的名称应用于各个枚举选项以在UI中显示也是很常见的。

一个简单的字符串数组怎么样?

var states = new[]
{
    "NO RUN ALLOWED",
    "STOPPED",
    "READY FOR RESTART",
    "END NEXT GAME",
    "RUNNING"
};

Dictionary听起来工作得很好,速度方面也不用担心:

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];

通过索引进行元组访问可能是O(1),但在集合或元组中搜索值不会是O(2)(除非您已经知道索引)。在您的示例中,如果在未来的版本中删除状态2,则每个消费者都可能需要重新设计。Dictionary允许您在集合中搜索O(1)处的键。

来自文档(强调矿):

Dictionary(Of TKey,TValue)泛型类从一组值的一组键。词典中的每一个添加由一个值及其关联键组成。检索值的方式使用它的键非常快,接近O(1),因为Dictionary(OfTKey、TValue)类实现为哈希表。