Table de données C # pour contenir des tables (imbrication infinie)

Je suis relativement nouveau en C# – mais je viens d’un contexte C/C++ .

J’ai besoin d’un type de données (classe) similaire à DataTable , mais permettant aux colonnes stockées de contenir des types “simples” (int, float, boolean, [chaîne]) AINSI que des données du même type (pour qu’une colonne puisse contenir une autre table qui a aussi des colonnes qui stockent les tables, etc.).

En langage C ++, ce que je décris ressemble à ceci:

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

Une colonne peut contenir n’importe quel type de données valide, y compris un type de données Table (d’où la capacité d’imbrication infinie implicite).

Mon approche initiale consistait à hériter de DataTable – mais je pensais venir ici pour vérifier si:

  1. Si une telle classe existe déjà quelque part (dans la bibliothèque .Net ou ailleurs)
  2. si c’est la bonne façon de s’y prendre

Dans le cas où je devrais «rouler moi-même», j’apprécierais des pointeurs (des extraits de code, par exemple) pour m’aider à démarrer.

[Modifier]

Utilisation proposée: Je compte utiliser ce type de données principalement pour sérialiser des objects dans ma bibliothèque (afin de pouvoir les envoyer dans des paquets de messages, etc.), mais aussi pour les utiliser comme une sorte de dictionnaire de données qui me permet de stocker des données de complexité arbitraire.

Je ne suis pas sûr de bien comprendre, mais qu’est-ce qui vous empêche de créer un DataColumn avec DataTable tant que type?

Quelque chose comme ce qui suit:

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

Maintenant, vous pouvez aller de l’avant et faire ce qui suit:

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

Et bien sûr, si vous vérifiez dans la fenêtre immeadiate:

 ? myTableOfTables.Rows[0][0] 

Tu auras:

 {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" 

Donc, vous avez déjà une classe qui permet ce genre de structure: DataTable

Si vous voulez un DataColumn capable de contenir n’importe quelle valeur, que ce soit un int , une ssortingng ou quoi que ce soit d’autre, définissez simplement son type en tant object .

en théorie, vous pouvez avoir une table avec une colonne de chaîne dans laquelle vous sérialisez la table nestede en XML. En .NET, vous pouvez simplement appeler la méthode WriteXML sur l’object DataSet …

En théorie, cela dépend vraiment du “pourquoi” que vous voulez faire et du “pourquoi” vous en avez besoin.

Une liste de tables ne serait-elle pas suffisante? Par exemple, en utilisant .NET Generics, vous pouvez créer des types comme celui-ci:

 List; List>; 

la principale question serait de savoir comment consumrez-vous votre structure de données par la suite?