将数组初始化为动态大小 - C#

时间:2011-03-04 17:05:55

标签: c# sqlite multidimensional-array system.data.sqlite

我正在使用数组来保存SQLite查询的结果,目前我正在使用二维表来执行此操作。

我遇到的问题是我必须在使用数组之前手动指定其中一个索引的大小,但感觉就像是浪费,因为我不知道将返回多少行。我使用的属性允许我检索数组初始化中使用的列数。

示例:

using (SQLiteDataReader dr = cmd.ExecuteReader())
{
       results = new object[10,dr.FieldCount];

       while (dr.Read())
       {
            jIterator++;

            for (int i = 0; i < dr.FieldCount; i++)
            {
                    results[jIterator, i] = dr.GetValue(i);
            }
       }
}
//I know there are a few count bugs

存储示例:

Array contents

我只是将数据添加到数组中,只要while循环返回true,在这个实例中我将第一个索引设置为10,因为我已经知道数据库中有多少元素,10个就足够了。

我将如何更改数组以使其大小可以是动态的,这是否可能基于我获取数据库结果的方式?

5 个答案:

答案 0 :(得分:11)

您不应该使用数组,您应该使用动态大小的容器,如List<T>。或者,更好的是,您可以使用类似ADO.NET DataTable之类的内容,因为这正是它设计用于存储的内容,使用DbDataAdapter将避免重复相同{ {1}}遍布整个地方的代码。

答案 1 :(得分:9)

不要使用数组。使用通用列表System.Collections.Generic.List<type>,您甚至可以拥有列表列表。这些是可调整大小的,并为您完成所有这些管道。

答案 2 :(得分:4)

我建议定义一个结构来保存您的联系信息,然后只创建该类型的通用列表。它们可以不受限制地扩展。

答案 3 :(得分:1)

您有几种选择:

  • 使用List<T[]>代替二维数组。
  • 将datareader加载到数据集而不是数组
  • 完全跳过datareader并使用dataadapter填充数据集
  • 使用迭代器块将datareader转换为IEnumerable而不是数组

其中,在大多数情况下,到目前为止,你最好的选择是最后一个;这意味着您不需要一次在内存中拥有查询的整个结果集,这是首先使用SqlDataReader的主要目的。

答案 4 :(得分:0)

您可以在C#中创建动态数组。

int[] intarray;

虽然其他回复表明List可能更合适。