Инициализация массива в динамический размер - C # - PullRequest
1 голос
/ 04 марта 2011

Я использую массив для хранения результатов запроса 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 ]

11 голосов
/ 04 марта 2011

Вы не должны использовать массив, вы должны использовать контейнер динамического размера, например List<T>. Или, что еще лучше, вы можете использовать что-то вроде ADO.NET DataTable, поскольку это именно то, для чего он предназначен, а использование DbDataAdapter позволит избежать повторения одного и того же кода IDataReader повсеместно.

9 голосов
/ 04 марта 2011

Не используйте массив.Используйте общий список System.Collections.Generic.List<type>, вы даже можете иметь список из списка.Они имеют изменяемый размер и выполняют всю эту работу за вас.

4 голосов
/ 04 марта 2011

Я бы предложил определить структуру для хранения вашей контактной информации, а затем просто создать общий список этого типа.Они могут расширяться без ограничений.

1 голос
/ 04 марта 2011

У вас есть несколько вариантов:

  • Используйте List<T[]> вместо 2-мерного массива.
  • Загрузить ваш массив данных в набор данных вместо массива
  • Полностью пропустите источник данных и используйте адаптер данных для заполнения набора данных
  • Использование блока итератора для преобразования заголовка данных в IEnumerable вместо массива

Из них, в большинстве случаев, безусловно, ваш лучший вариант - последний; это означает, что вам не нужно иметь полный набор результатов запроса в памяти за один раз, что является основным пунктом для использования SqlDataReader.

0 голосов
/ 04 марта 2011

Вы можете создавать динамические массивы в C #.

int[] intarray;

Хотя другие ответы, которые предлагают Список, могут быть более подходящими.

...