System.Data.DataTable,DataRowCollection和DataColumns:索引如何工作?

时间:2011-06-16 19:56:33

标签: c# datatable class-design

DataTable

我可以像这样访问所有DataRow元素:

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

此外,我可以访问所有DataColumn元素,如下所示:

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 个答案:

答案 0 :(得分:3)

建立简单的阶级关系并不困难:

class Table
{
    public IEnumerable<Row> Rows { get; set; }
}
class Row
{
    public IEnumerable<Cell> Cells { get; set; }
}
class Cell { }

答案 1 :(得分:1)

可以这么简单:

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

允许您访问它:

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

在实际的DataTable中,object[]包含在DataRow类中,该类提供Field<>等访问函数,而List<>暴露更有限通过DataRowCollection类向外部提供的信息量。

答案 2 :(得分:1)

该表格包含DataColumn列表。这是列定义列表。该表有一个行列表。每列对列列表中的每列都有一个单元格。


诀窍是行是由表创建的。该表知道Columns集合的长度,以及列的数据类型以及对它们的任何约束。当表创建DataRow时,它会使用正确的列数创建它。