Reputation: 812
These are the contents of my datatable dtAllData
.
column_1 column_2 column_3
-------- -------- --------
sec_1 Test1 2
sec_1 Result1 5
sec_1 Unit1 2
sec_2 Test2 2
sec_2 Result2 2
sec_2 Unit2 5
sec_3 Test3 2
sec_3 Result3 2
sec_3 Unit3 2
I need to split it into multiple datatables on the basis of contents in column column_1
.
So in this case I'm supposed to get 3 tables (one having all rows with sec_1
, other with sec_2
& another with sec_3
).
I tried this:
var dtArray = dtAllData.AsEnumerable()
.GroupBy(row => new
{
column_1 = (string)row["column_1"]
});
DataTable[] array = new DataTable[dtArray.Count()];
How can I get tables in array
from dtArray
?
Upvotes: 2
Views: 8387
Reputation: 1
Function splitDataTable(ByVal tbl As DataTable) As DataTable()
Dim tableCount = Math.Ceiling(tbl.Rows.Count / NewCountRows)
Dim Divisor = tbl.Rows.Count / tableCount
Dim tables = tbl.AsEnumerable().Select(Function(r, i) New With {.row = r, .index = i}).GroupBy(Function(x) Math.Floor(x.index / Divisor)).Select(Function(g) g.Select(Function(x) x.row).CopyToDataTable())
Return tables.ToArray
End Function
Upvotes: -2
Reputation: 812
Modifying Kaf
's solution, I achieved what I wanted as:
var uniqueList = dtAllData.AsEnumerable().Select(x=> x.Field<string>("column_1")).Distinct();
List<string> myList = new List<string>();
myList =uniqueList.ToList();
DataTable[] array = new DataTable[myList.Count()];
int index = 0;
foreach (string item in myList)
{
var Result = from x in dtAllData.AsEnumerable()
where x.Field<string>("column_1") == item
select x;
DataTable table = Result.CopyToDataTable();
array[index] = table;
index++;
}
So the array
contains 3 datatables with different values of column_1
Upvotes: 0
Reputation: 33809
Using CopyToDataTable()
method to get the data into a new DataTable.
var Result = from x in dtAllData.AsEnumerable()
where x.Field<string>("column_1") == "sec_1"
select x;
DataTable t1 = Result.CopyToDataTable();
Another way is using LoadDataRow()
method. Here is an example
Upvotes: 4
Reputation: 3095
If you know the exact names of column_1 you can use .Select .Select("column_1 = sec_1")
etc. or use a DataView
Upvotes: 0