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

我对C#比较C# – 但是来自C/C++背景。

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

用C ++的说法,我所描述的是这些内容:

 typedef union { /*... */ } ValueType; typedef std::vector 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 m_cols; public: Table(const std::string& name, const std::vector *cols_ptr = NULL); // ... }; 

列可以包含任何有效的数据类型 – 包括表数据类型(因此隐式无限嵌套function)。

我最初的想法是从DataTableinheritance – 但我想在这里检查是否:

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

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

[编辑]

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

我不确定我是否正确理解,但是什么阻止您使用DataTable创建一个DataColumn类型?

类似于以下内容:

 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 ,无论是intstring还是你有什么,那么只需将其类型定义为object

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

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

表格列表不够用吗? 例如,使用.NET Generics,您可以创建如下类型:

 List; List>; 

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