2012-02-27 103 views
0

我有一个元组元组的Python中的数据。例如:C#中的数据结构模拟元组的Python元组

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

我知道Python中的元组访问是O(1),我想在C#中获得这样的内容。我已经在一本词典中思考,但我也认为它在性能方面可能有害。任何想法?

回答

2

解释听起来像它会工作得很好,没什么可担心的速度聪明之一:

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

的字典泛型类从一组键的一组值提供了一个映射。字典 的每个添加项都包含一个值及其关联的键。使用它的键由 检索值是非常快的,接近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]; 
5

如果您担心应用程序状态来实现,这是更好为此使用enum

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

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

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

+0

我喜欢强打字。你可能还想要一个'全局'的国家集合,所以你不要继续调用Enum.GetNames()/ GetValues()。您也可以为每个枚举选项设置int值。 – foson 2012-02-27 18:21:57

2

一个简单的字符串数组呢?通过指数

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

字符串数组对我不好,因为我想支持这种情况,因为这些键不是“int”。另一个例子可能是: – JavierElBene 2012-02-27 18:53:59

+1

@ user1216697那些要求应该在原始问题中。 – asawyer 2012-02-27 19:00:56

+0

哦,好!所以它... – Will 2012-02-27 19:33:43

1

元组的访问可以是O(1),而是通过集合或值的元组搜索将不会是O(1)(除非你已经知道了索引)。在你的例子中,如果在将来的版本中,你删除状态2,每个消费者可能需要重新设计。字典允许您搜索O(1)处的密钥集合。

1

documentation(重点煤矿):

的词典(TKEY的,TValue)泛型类从 提供的映射一组键的一组值的。字典 的每个添加项都包含一个值及其关联的键。由于字典(TKey,TValue)类的字典实现为散列表,因此使用其密钥检索值为 的速度非常快,接近于O(1)