我应该在这种情况下使用什么样的集合?
我正在写一个类来存储某种表结构。我应该在这种情况下使用什么样的集合?
现在,此表结构中的每个列都有一个名称和一个索引。
现在这一列中的每一行都会循环遍历,并且数据将使用列的名称而不是索引来请求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左右的字符。
在此先感谢。
使用Dictionary<string,int>
来根据ID存储列的名称。
使用您的实例中(该错过如何_columns
填充):
private IDictionary<string,int> _columns;
private int _width;
private int getIndex(string columnName)
{
return _columns[columnName];
}
它是如何填充它并不重要,因为它是一个固定长度的数组,但如果你想知道,它是一个for(int i = 0; i <_width i getcolumnname class="text-secondary"> Aidiakapi 2011-03-06 21:04:47
@Aidiakapi - 从来没有说过我想知道,只是你(并为此)没有表现出来。 – Oded 2011-03-06 21:08:04
谢谢,运行基准测试后,它下降到14760ms的字典和23225ms的字符串数组。 _(查找100000000次,每次有两个不同的值)_尽管创建字典需要6166ms,而字符串数组只需要754ms _(创建10000000次)_,但可能需要超过10K次的列'只设置一次,谢谢:) – Aidiakapi 2011-03-06 21:16:12
既然你通常会通过名称来访问列,这听起来像使用一个Map(Dictionary类在C#中的好地方)将字符串映射到列(字符串数组)。这将允许O(1)访问名称而不是上述代码中的当前O(n)。
缺点是你不能直接通过列索引访问。但是,这很容易解决 - 只需保留列名称列表并使用它们进行索引即可!然后,您可以拨打
_columnsMap[_columns[index]]
如果你需要指数号码,它仍然是O(1)时间。
很好的解释为什么,但我恐怕另一个老兄的答案只是更好一点,谢谢:) +1 – Aidiakapi 2011-03-06 21:12:31
字典http://msdn.microsoft.com/en-us/library/xfhwa508.aspx – 2011-03-06 20:56:27
我以为字典被用来存储数据的一个关键,而这是相反的方式。无论如何,我会基准它。 – Aidiakapi 2011-03-06 20:58:55
你多久会加入/删除集合中的东西? – Nix 2011-03-06 21:00:32