System.Data.DataTable、DataRowCollection和DataColumns:索引是如何工作的

本文关键字:何工作 工作 索引 DataTable Data DataRowCollection DataColumns System | 更新日期: 2023-09-27 17:59:25

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);
}

最后,我可以访问DataTable对象的每个单独的Cell,如下所示:

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);
  }
}

至少在第三种技术中看起来有些信息丢失了。

这是我的问题:这个对象数组是如何管理的

我一直在研究如何用这种基本类型的功能重新创建一些东西(因为我已经很熟悉了),但我只是不知道如何设计所有这些小的子类来让它工作!

System.Data.DataTable、DataRowCollection和DataColumns:索引是如何工作的

建立一个简单的类关系并不困难:

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

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


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

它可以简单到:

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

这让你可以像一样访问它

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

在实际的DataTable中,object[]被封装在DataRow类中,该类提供诸如Field<>之类的访问功能,并且List<>通过DataRowCollection类向外部暴露更有限的信息量。