Estoy buscando una buena estructura de datos para una tabla que se verá así:

Name   | ID | Time  | A3 | A2 | D6 | L4 | H1 | ...
Peter    01   11:01   1    4    8         1    ...
James    02   11:37   7         5    2    2    ...
....

Los valores de Nombre, ID y Hora se dan "manualmente" por mi herramienta, todas las columnas después de eso ("A3", "A2", ...) provienen de una cadena json como

{"A3":"7","D6":"5",...}

Mi problema es que estos valores json pueden tener cualquier nombre y que no sé qué persona generará qué valores (en la muestra, James no tiene un valor para A2).

¿Qué tipo de clase / estructura sería mejor para almacenar esta combinación de variables?

Por supuesto, debería ser "fácil" agregar nuevas líneas si "llegan" nuevos valores. Y también quiero escribir esta estructura en un csv más adelante, pero ese no es el problema aquí.

Intenté mucho con List <> y Directory <> pero no logré crear nada que sea fácil de manejar.

¡Gracias de antemano!

editar: finalmente utilicé una combinación de ambas respuestas:

public class ResultData
{
    public string currentName { get; set; }
    public string currentID { get; set; }
    public DateTime currentTimestamp { get; set; }
    public DataTable results { get; set; }

    public ResultData()
    {
        results = new DataTable();

        // must have columns
        results.Columns.Add("Name", typeof(string));
        results.Columns.Add("ID", typeof(string));
        results.Columns.Add("Timestamp", typeof(DateTime));
    }


    public void AddResult(Dictionary<string, string> resultVars)
    {
        // TODO: check if person is already in list

        DataRow dr = results.NewRow();

        // add basics
        dr["Name"] = currentName;
        dr["ID"] = currentID;
        dr["Timestamp"] = currentTimestamp;

        // check columns
        foreach (var varName in resultVars)
        {
            // add column if needed
            if (!results.Columns.Contains(varName.Key))
            {
                results.Columns.Add(varName.Key);
            }

            // add values
            dr[varName.Key] = varName.Value;
        }

        //finally add row
        results.Rows.Add(dr);
    }
}

¡Funciona bien para mí! :-)

0
Quen 14 dic. 2016 a las 17:09

2 respuestas

La mejor respuesta

Aquí hay una solución que encuentra en C #,

La clase DataTable almacena filas y columnas de datos. Es parte del espacio de nombres System.Data. Agregamos, seleccionamos e iteramos sobre los datos almacenados.

Programa C # que usa DataTable

 using System;
    using System.Data;

    class Program
    {
        static void Main()
        {
        // Get the DataTable.
        DataTable table = GetTable();
        // ... Use the DataTable here with SQL.
        }

        /// <summary>
        /// This example method generates a DataTable.
        /// </summary>
        static DataTable GetTable()
        {

        // Here we create a DataTable with four columns.
        DataTable table = new DataTable();
        table.Columns.Add("Dosage", typeof(int));
        table.Columns.Add("Drug", typeof(string));
        table.Columns.Add("Patient", typeof(string));
        table.Columns.Add("Date", typeof(DateTime));

        // Here we add five DataRows.
        table.Rows.Add(25, "Indocin", "David", DateTime.Now);
        table.Rows.Add(50, "Enebrel", "Sam", DateTime.Now);
        table.Rows.Add(10, "Hydralazine", "Christoff", DateTime.Now);
        table.Rows.Add(21, "Combivent", "Janet", DateTime.Now);
        table.Rows.Add(100, "Dilantin", "Melanie", DateTime.Now);
        return table;
        }
    }

Una cosa más buena es que Visual Studio te ayuda a visualizar los datos,

Pruebe esto, tiene muchas posibilidades con DataRow Class también, es rápido y simple para almacenar datos de tabla.

0
Ranjith Murthy 14 dic. 2016 a las 14:32

¿Has probado una clase que contiene una propiedad de diccionario?

public class MyClass{
  public int id {get; set;}
  public string name {get; set;}
  public Datetime time {get; set;}
  public Dictionary<string, string> {get;}
}
0
ScoobyDrew18 14 dic. 2016 a las 14:17