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)。
我最初的想法是从DataTable
inheritance – 但我想在这里检查是否:
- 如果这样的类已经存在于某个地方(在
.Net
库或其他地方) - 如果这是正确的方法
如果我需要“自己滚动”,我会很感激一些指针(即代码片段)来帮助我开始。
[编辑]
建议用法:我打算主要使用这种数据类型来序列化我的库中的对象(所以我可以用消息包等发送它们),但是,所以我可以将它们用作一种允许我存储数据的数据字典任意复杂性。
我不确定我是否正确理解,但是什么阻止您使用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
,无论是int
, string
还是你有什么,那么只需将其类型定义为object
。
理论上你可以有一个带有字符串列的表,在其中将嵌套表序列化为XML,在.NET中你可以简单地在DataSet对象上调用WriteXML方法……
从理论上讲,这实际上取决于你为什么要做这个以及你需要它做什么。
表格列表不够用吗? 例如,使用.NET Generics,您可以创建如下类型:
List; List>;
主要问题是你将如何使用你的数据结构?