Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在这种情况下,我应该使用什么集合?_C#_Collections - Fatal编程技术网

C# 在这种情况下,我应该使用什么集合?

C# 在这种情况下,我应该使用什么集合?,c#,collections,C#,Collections,我正在编写一个类来存储某种表结构 现在,此表结构中的每一列都有一个名称和一个索引 现在,此列中的每一行都将循环通过,并且90%的案例将使用列的名称而不是其索引来请求数据 那么,存储列的好数据结构是什么,这样它就可以基于名称非常快速地检索索引。现在我正在使用一个简单的字符串[],但我想知道是否有更快的方法来实现这一点 部分守则: private string[] _columns; private int _width; private int getIndex(string columnNam

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

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

现在,此列中的每一行都将循环通过,并且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;
}
private string[]\u列;
私有整数宽度;
private int getIndex(字符串列名)
{
对于(int i=0;i<\u width;i++)
{
if(_columns[i]==columnName)返回i;
}
返回-1;
}
列的名称在设置之后将保持不变,它们的长度通常为10-16个字符

提前感谢。

使用
字典
根据列的ID存储列的名称

使用您的示例(忽略了
\u列
的填充方式):

privateIDictionary\u列;
私有整数宽度;
private int getIndex(字符串列名)
{
返回_列[列名称];
}
使用
字典
根据列的ID存储列的名称

使用您的示例(忽略了
\u列
的填充方式):

privateIDictionary\u列;
私有整数宽度;
private int getIndex(字符串列名)
{
返回_列[列名称];
}

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

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

_columnsMap[_columns[index]]

如果您需要按数字进行索引,但仍然是O(1)时间。

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

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

_columnsMap[_columns[index]]


如果您需要按数字进行索引,现在仍然是O(1)倍。

字典我认为字典是用来按键存储数据的,而这是另一种方式。无论如何,我会对它进行基准测试。你打算多久从集合中添加/删除一次内容?我引用我自己的问题:列的名称在设置后将保持不变。dictionary我认为dictionary是用来通过键存储数据的,而这是另一种方式。无论如何,我会对它进行基准测试。你打算多久从集合中添加/删除内容一次?我引用我自己的问题:列的名称在设置之后将保持不变。它的填充方式无关紧要,因为它是一个固定长度的数组,但如果你想知道,它是一个for(int I=0;I<\u width;I++)\u columns[I]=GetColumnName(i)@Aidiakapi-我从来没有说过我想知道,只是你(因此我)没有显示它。谢谢,在运行基准测试后,字典的速度降到14760ms,字符串数组的速度降到23225ms。(查找100000000次,每次两个不同的值。)虽然创建字典需要6166ms,而字符串数组只需要754ms(创建10000000次),但列的请求可能超过10K次,而它们只设置了一次,谢谢:)@Aidiakapi-这并不奇怪。在固定数组上查找总是比动态列表便宜…实际上,字典是动态的。。。字符串数组是固定的,但是字典比字符串数组快50%。只是字典的创建过程几乎是字符串数组的9倍长。它的填充方式无关紧要,因为它是一个固定长度的数组,但是如果你想知道的话,它是一个for(int i=0;i<\u width;i++)\u columns[i]=GetColumnName(i)@Aidiakapi-我从来没有说过我想知道,只是你(因此我)没有显示它。谢谢,在运行基准测试后,字典的速度降到14760ms,字符串数组的速度降到23225ms。(查找100000000次,每次两个不同的值。)虽然创建字典需要6166ms,而字符串数组只需要754ms(创建10000000次),但列的请求可能超过10K次,而它们只设置了一次,谢谢:)@Aidiakapi-这并不奇怪。在固定数组上查找总是比动态列表便宜…实际上,字典是动态的。。。字符串数组是固定的,但是字典比字符串数组快50%。只是字典的创建过程几乎是字符串数组的9倍。很好的解释为什么,但我担心另一个家伙的答案只是稍微好一点,谢谢:)+1很好的解释为什么,但我担心另一个家伙的答案只是稍微好一点,谢谢:)+1