DataTable icon indicating copy to clipboard operation
DataTable copied to clipboard

Programmatic way to add rows of data to a DataTable, modify data through indexers

Open yellis opened this issue 11 years ago • 1 comments

DataTable.New contains different methods of creating a new MutableDataTable based on different source data. However, it appears that there is no way right now to add data one row at a time to a MutableDataTable, nor is there an easy way to modify specific "cells" of data in a table.

What I am looking for (adding a few different possible approaches):

var table = new MutableDataTable();
table.AddColumn("Id");
table.AddColumn("Name");
table.AddNewRow(new {Id = 1, Name="John"});
table.AddNewRow("1", "John"); // AddNewRow with param strings
var row = table.GetNewRow(); // appends new row to end of table and returns it
row[0] = 3; // use row indexer to access and modify values
row[1] = "Jane";
table.Rows[0][1] = "Jack"; // use rows indexer and then indexer on values in row to modify data

yellis avatar Mar 19 '14 12:03 yellis

MutableDataTable is an array of column arrays. This makes it very easy to rearrange columns, but it means adding a new row is expensive since it means reallocating every column.

The approach I’ve used for row-based operations has been

Using a 2-d dictionary (this is also great for sparse tables):

    static void Main(string[] args)
    {
        var d = new Dictionary2d<int,string,string>(); 

        d[0,"Name"] = "jack";
        d[0, "score"] = "23";
        d[1,"Name"] = "jill";
        d[1, "score"] = "45";

        var table = DataTable.New.From2dDictionary(d);
        table.SaveToStream(Console.Out);
    } 

Using an IEnumerable: ''' class Row { public string Name { get; set; } public int score { get; set; } }

    static IEnumerable<Row> GetRows()
    {
        yield return new Row { Name = "Jack", score = 23 };
        yield return new Row { Name = "Jill", score = 45 };
    } 

    static void Main(string[] args)
    {
        var table = DataTable.New.FromEnumerable(GetRows());
        table.SaveToStream(Console.Out);
    } 

'''

Cells in a datatables can be changed like so:

''' // Mutate table.Columns[0].Values[1] = "Jen"; '''

MikeStall avatar Mar 20 '14 15:03 MikeStall