c#数据表来保存表(无限嵌套)

本文关键字:无限 嵌套 数据表 保存 | 更新日期: 2023-09-27 18:03:42

我对C#比较陌生,但我有C/C++的背景。

我需要一个类似于DataTable的数据类型(类),但允许存储的列保存"简单"类型(int, float, boolean, [string])以及相同类型的数据(以便一列可以保存另一个表也有存储表的列等)。

在c++语言中,我所描述的是这样的:

typedef union { /*... */ } ValueType;
typedef std::vector<ValueType> ColumnValues; 
class Column
{
    private:
       std::string m_name ;
       ColumnValues m_values;
    public:
       Column(const std::string& name);
       // ...
}
class Table
{
   private:
      std::string m_name;
      std::vector<Column> m_cols;
    public:
       Table(const std::string& name, const std::vector<Column> *cols_ptr = NULL);
       // ...   
};

列可以保存任何有效的数据类型——包括Table数据类型(因此隐含无限嵌套能力)。

我最初的想法是继承DataTable -但我想我来这里检查一下:

  1. 如果这样的类已经在某处存在(无论是在.Net库或其他地方)
  2. 如果这是正确的做法

如果我需要"滚动我自己的",我将感激一些指针(即代码片段)来帮助我开始。

[编辑]

建议用法:我打算主要使用这种数据类型来序列化我的库中的对象(所以我可以在消息包中发送它们等),但是,我也可以将它们用作一种数据字典,允许我存储任意复杂性的数据。

c#数据表来保存表(无限嵌套)

我不确定我是否理解正确,但是是什么阻止你创建一个DataColumnDataTable作为它的类型?

类似如下:

DataTable myTableOfTables = new DataTable("TableOfTables);
myTableOfTables.Columns.Add(new DataColumn("Table", typeof(DataTable)));

现在你可以继续做下面的事情:

myTableOfTables.Rows.Add(myTableOfTables.NewRow()[0] = new DataTable("NestedTable"));

当然,如果你查看当前窗口:

? myTableOfTables.Rows[0][0]

你将得到:

{NestedTable}
    base {System.ComponentModel.MarshalByValueComponent}: {NestedTable}
    CaseSensitive: false
    ChildRelations: {System.Data.DataRelationCollection.DataTableRelationCollection}
    Columns: {System.Data.DataColumnCollection}
    Constraints: {System.Data.ConstraintCollection}
    DataSet: null
    DefaultView: {System.Data.DataView}
    DisplayExpression: ""
    ExtendedProperties: Count = 0
    HasErrors: false
    IsInitialized: true
    Locale: {es-ES}
    MinimumCapacity: 50
    Namespace: ""
    ParentRelations: {System.Data.DataRelationCollection.DataTableRelationCollection}
    Prefix: ""
    PrimaryKey: {System.Data.DataColumn[0]}
    RemotingFormat: Xml
    Rows: {System.Data.DataRowCollection}
    Site: null
    TableName: "NestedTable"

你已经有了一个允许这种结构的类:DataTable

如果您想要的是一个能够包含任何值的DataColumn,无论是int, string还是其他值,那么只需将其类型定义为object

理论上,你可以有一个带有字符串列的表,你可以将嵌套表序列化为XML,在。net中,你可以简单地在DataSet对象上调用WriteXML方法…

从理论上讲,这取决于你为什么要这样做,以及你需要它做什么。

一张表还不够吗?例如,使用。net泛型你可以创建这样的类型:

List<DataTable>;
List<List<DataTable>>;

的主要问题将是如何使用你的数据结构之后?