2011-03-06 49 views
0

我正在写一个类来存储某种表结构。我应该在这种情况下使用什么样的集合?

现在,此表结构中的每个列都有一个名称和一个索引。

现在这一列中的每一行都会循环遍历,并且数据将使用列的名称而不是索引来请求90%的情况。

那么什么是良好的数据结构来存储列,以便它可以基于名称非常快速地检索索引。现在我正在使用一个简单的字符串[],但我想知道是否有更快的方法来做到这一点。

零件代码:

private string[] _columns; 
private int _width; 

private int getIndex(string columnName) 
{ 
    for (int i = 0; i < _width; i++) 
    { 
     if (_columns[i] == columnName) return i; 
    } 
    return -1; 
} 

列的名称将是恒定的,他们已经设定后,而且他们大多是长10-16左右的字符。

在此先感谢。

+2

字典http://msdn.microsoft.com/en-us/library/xfhwa508.aspx – 2011-03-06 20:56:27

+0

我以为字典被用来存储数据的一个关键,而这是相反的方式。无论如何,我会基准它。 – Aidiakapi 2011-03-06 20:58:55

+0

你多久会加入/删除集合中的东西? – Nix 2011-03-06 21:00:32

回答

1

使用Dictionary<string,int>来根据ID存储列的名称。

使用您的实例中(该错过如何_columns填充):

private IDictionary<string,int> _columns; 
private int _width; 

private int getIndex(string columnName) 
{ 
    return _columns[columnName]; 
} 
+0

它是如何填充它并不重要,因为它是一个固定长度的数组,但如果你想知道,它是一个for(int i = 0; i <_width; i ++)_columns [i] = GetColumnName(i); – Aidiakapi 2011-03-06 21:04:47

+0

@Aidiakapi - 从来没有说过我想知道,只是你(并为此)没有表现出来。 – Oded 2011-03-06 21:08:04

+0

谢谢,运行基准测试后,它下降到14760ms的字典和23225ms的字符串数组。 _(查找100000000次,每次有两个不同的值)_尽管创建字典需要6166ms,而字符串数组只需要754ms _(创建10000000次)_,但可能需要超过10K次的列'只设置一次,谢谢:) – Aidiakapi 2011-03-06 21:16:12

3

既然你通常会通过名称来访问列,这听起来像使用一个Map(Dictionary类在C#中的好地方)将字符串映射到列(字符串数组)。这将允许O(1)访问名称而不是上述代码中的当前O(n)。

缺点是你不能直接通过列索引访问。但是,这很容易解决 - 只需保留列名称列表并使用它们进行索引即可!然后,您可以拨打

_columnsMap[_columns[index]] 

如果你需要指数号码,它仍然是O(1)时间。

+0

很好的解释为什么,但我恐怕另一个老兄的答案只是更好一点,谢谢:) +1 – Aidiakapi 2011-03-06 21:12:31

相关问题