Ratna
Ratna

Reputation: 2319

how to clone/copy a datatable with only first n columns using linq

I have a datatable containing over 100 columns, how ever I need to strip out all columns except first 11 columns. I need to retain data of 1st 11 columns. I am doing it with following code

public DataTable validdatatable(DataTable table)
{
     DataTable dt = new DataTable();
     for (int i = 0; i < 11; i++)
     {
          DataColumn dc = new DataColumn();
          dc.ColumnName = table.Columns[i].ColumnName;
          dc.DataType = table.Columns[i].DataType;
          dt.Columns.Add(dc);
     }
     for (int i = 0; i < table.Rows.Count; i++)
     {
          object[] ob = table.Rows[i].ItemArray;
          ...
          ...
     }
     return dt;
}

This methods works but is too heavy on CPU and Ram.

Is there any other method with which I can proceed?

Upvotes: 0

Views: 847

Answers (3)

PKanold
PKanold

Reputation: 148

If you know the column names you want to keep this should work:

    NewDataTable = DT.Copy.DefaultView.ToTable(true, "Item", "Standard Number", "Part Size", "Material", "Etc.");

The initial true is the Distinct parameter. Followed by the desired column names.

Upvotes: 0

CharlesNRice
CharlesNRice

Reputation: 3259

You can try this. The only difference would be instead of object[] ob = table.Rows[i].ItemArray it will just grab the first 11 columns using the index and make an array out of that (itemArray will make an array of all 100 columns). Still doubt this will solve your memory issues if you are that tight but it's probably worth a shot.

var copyDt = new DataTable();
for (var i = 0; i < 11; i++)
{
    copyDt.Columns.Add(dataTable.Columns[i].ColumnName, dataTable.Columns[1].DataType);
}
copyDt.BeginLoadData();
foreach (DataRow dr in dataTable.Rows)
{
    copyDt.Rows.Add(Enumerable.Range(0, 11).Select(i => dr[i]).ToArray());
}
copyDt.EndLoadData();

Upvotes: 0

user3383479
user3383479

Reputation:

Try this:

public DataTable validdatatable(DataTable table)
{
 var dt = table.Columns.Cast<DataColumn>().Take(11);

 return dt.CopyToDataTable();
}

Or Something like this. It will give you at least a way to work on it. Note that You need to add a reference to the assembly: System.Data.DataSetExtensions.dll then you can write your function like above.

Upvotes: 1

Related Questions