System.Data.DataTable, DataRowCollection и DataColumns: как работает индексация? - PullRequest
2 голосов
/ 16 июня 2011

В DataTable:

я могу получить доступ ко всем элементам DataRow следующим образом:

DataTable table = GetMyTable();
for (int i = 0; i < table.Rows.Count; i++) {
  DataRow row = table.Rows[i];
  Console.WriteLine(row);
}

Кроме того, я могу получить доступ ко всем элементам DataColumn, таким какthis:

DataTable table = GetMyTable();
for (int i = 0; i < table.Columns.Count; i++) {
  DataColumn column = table.Columns[i];
  Console.WriteLine(column);
}

Наконец, я могу получить доступ к каждому Cell объекту DataTable следующим образом:

DataTable table = GetMyTable();
for (int i = 0; i < table.Rows.Count; i++) {
  DataRow row = table.Rows[i];
  object[] array = row.ItemArray;
  for (int j = 0; j < array.Length; j++) {
    object cell = array[j];
    Console.WriteLine(cell);
  }
}

По крайней мере, похоже, что некоторая информация теряется втретий метод.

Вот мой вопрос: Как управляется этот массив объектов?

Я играл с тем, как воссоздать что-тос этим базовым типом функциональности (поскольку я с ним уже знаком), но я просто не знаю, как спроектировать все эти маленькие подклассы, чтобы он работал!

Ответы [ 3 ]

3 голосов
/ 17 июня 2011

Создание простых классовых отношений не сложно:

class Table
{
    public IEnumerable<Row> Rows { get; set; }
}
class Row
{
    public IEnumerable<Cell> Cells { get; set; }
}
class Cell { }
1 голос
/ 17 июня 2011

У таблицы есть список DataColumn. Это список определений столбцов. В таблице есть список строк. Каждая строка имеет одну ячейку для каждого столбца в списке столбцов.


Хитрость в том, что строки создаются таблицей. Таблица знает длину коллекции Columns, а также типы данных столбцов и любые ограничения на них. Когда таблица создает DataRow, она создает ее с правильным количеством столбцов.

1 голос
/ 17 июня 2011

Это может быть просто:

List<object[]> Rows {get; private set;} 

, что позволяет получить к нему доступ следующим образом:

obj[5][3]="meep.";

В действительности DataTable, object[] заключено в *Класс 1009 *, который предоставляет функции доступа, такие как Field<> и т. Д., А List<> предоставляет более ограниченный объем информации для внешнего доступа через класс DataRowCollection.

...