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
-但我想我来这里检查一下:
- 如果这样的类已经在某处存在(无论是在
.Net
库或其他地方) - 如果这是正确的做法
如果我需要"滚动我自己的",我将感激一些指针(即代码片段)来帮助我开始。
[编辑]
建议用法:我打算主要使用这种数据类型来序列化我的库中的对象(所以我可以在消息包中发送它们等),但是,我也可以将它们用作一种数据字典,允许我存储任意复杂性的数据。
我不确定我是否理解正确,但是是什么阻止你创建一个DataColumn
与DataTable
作为它的类型?
类似如下:
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>>;
的主要问题将是如何使用你的数据结构之后?