在这种情况下我应该使用什么样的集合?

时间:2011-03-06 20:55:37

标签: c# collections

我正在编写一个类来存储某种表结构。

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

现在,此列中的每一行都将循环播放,并且数据将使用列的名称而不是其索引来请求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 个答案:

答案 0 :(得分:3)

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

缺点是您将无法再通过列索引直接访问。但是,这很容易解决 - 只需保留列名列表并使用它们进行索引!然后你可以打电话

_columnsMap[_columns[index]]

如果你需要按编号索引,它仍然是O(1)时间。

答案 1 :(得分:1)

使用Dictionary<string,int>存储列的名称与其ID。

使用您的示例(错过了_columns的填充方式):

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

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