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

3
我相对于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);
       // ...   
};

一个列可以保存任何有效的数据类型,其中包括表格数据类型(因此具有隐式无限嵌套功能)。

我的初始想法是从DataTable继承,但我想在这里检查一下:

  1. 是否已经存在这样的类(无论是在.Net库中还是其他地方)
  2. 是否是正确的方法

如果需要“自己动手”,我希望能得到一些指导(例如代码片段),以帮助我入门。

[编辑]

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


1
描述一种使用这些数据结构的情境。 - sll
你需要DataTable的复杂性吗? - driis
2个回答

4
我不确定我是否理解正确,但是什么阻止你创建一个类型为DataTableDataColumn?就像下面这样:
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


在阅读了一些关于DataTables的资料后,我认为我可能在尝试重新发明轮子... DataTable似乎已经做了我想做的一切... - oompahloompah

0

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

这在理论上是可行的,但它确实取决于您想要做什么以及需要它的原因。

难道一个表格列表就不够了吗?例如,使用.NET泛型,您可以创建如下类型:

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接