我想拆分DataTable,以便我可以将其块从一个地方上传到另一个地方。
例如
选择前100行 接下来的100行 选择接下来的100行等等......
有没有办法像数据库中的光标那样做?我不喜欢使用循环等来计算行数。
答案 0 :(得分:9)
YourDataTable.Select()
为您提供数据数组
linq怎么样?
Fro示例YourDataTable.Select (x => x).Take (100).ToEnumerable()
为您提供下一个100的DataRows
和YourDataTable.Select (x => x).Skip(100).Take (100).ToEnumerable()
。
答案 1 :(得分:6)
试试这个:
public static class DataExtensions
{
public static IEnumerable<IEnumerable<DataRow>> Partition(this DataTable dataTable, int partitionSize)
{
var numRows = Math.Ceiling((double)dataTable.Rows.Count);
for(var i = 0; i < numRows / partitionSize; i++)
{
yield return Partition(dataTable, i * partitionSize, i * partitionSize + partitionSize);
}
}
private static IEnumerable<DataRow> Partition(DataTable dataTable, int index, int endIndex)
{
for(var i = index; i < endIndex && i < dataTable.Rows.Count; i++)
{
yield return dataTable.Rows[i];
}
}
}
var partitions = dataTable.Partition(100);
这样做的:
dataTable.Skip(0).Take(100);
dataTable.Skip(100).Take(100);
dataTable.Skip(200).Take(100);
dataTable.Skip(300).Take(100);
将迭代0次,并在第一次执行时取100。然后迭代100行,取100,然后迭代200行,然后取100等等。
上面会做一个懒惰的提取,只打一次
答案 2 :(得分:3)
这是一种简单的方法:
public DataSet test(DataSet ds, int max)
{
int i = 0;
int j = 1;
DataSet newDs = new DataSet();
DataTable newDt = ds.Tables[0].Clone();
newDt.TableName = "Table_" + j;
newDt.Clear();
foreach (DataRow row in ds.Tables[0].Rows)
{
DataRow newRow = newDt.NewRow();
newRow.ItemArray = row.ItemArray;
newDt.Rows.Add(newRow);
i++;
if (i == max)
{
newDs.Tables.Add(newDt);
j++;
newDt = ds.Tables[0].Clone();
newDt.TableName = "Table_" + j;
newDt.Clear();
i = 0;
}
}
return newDs;
}
你能试试吗?
答案 3 :(得分:2)
使用linq选择记录部分 堆栈溢出中的这个链接可能会有所帮助 Split a collection into n parts with LINQ?
答案 4 :(得分:1)
检查:splitting a large datatable into smaller batches from c-sharpcorner.com
internal static List<datatable> SplitTable(DataTable originalTable, int batchSize)
{
List<datatable> tables = new List<datatable>();
DataTable new_table = new DataTable();
new_table = originalTable.Clone();
int j = 0;
int k = 0;
if (originalTable.Rows.Count <= batchSize)
{
new_table.TableName = "Table_" + k;
new_table = originalTable.Copy();
tables.Add(new_table.Copy());
}
else
{
for (int i = 0; i < originalTable.Rows.Count; i++)
{
new_table.NewRow();
new_table.ImportRow(originalTable.Rows[i]);
if ((i + 1) == originalTable.Rows.Count)
{
new_table.TableName = "Table_" + k;
tables.Add(new_table.Copy());
new_table.Rows.Clear();
k++;
}
else if (++j == batchSize)
{
new_table.TableName = "Table_" + k;
tables.Add(new_table.Copy());
new_table.Rows.Clear();
k++;
j = 0;
}
}
}
return tables;
}
答案 5 :(得分:0)
Improving on @vanessa
public DataSet SplitDataTable(DataTable tableData, int max)
{
int i = 0;
int j = 1;
int countOfRows = tableData.Rows.Count;
DataSet newDs = new DataSet();
DataTable newDt = tableData.Clone();
newDt.TableName = tableData.TableName+"_" + j;
newDt.Clear();
foreach (DataRow row in tableData.Rows)
{
DataRow newRow = newDt.NewRow();
newRow.ItemArray = row.ItemArray;
newDt.Rows.Add(newRow);
i++;
countOfRows--;
if (i == max )
{
newDs.Tables.Add(newDt);
j++;
newDt = tableData.Clone();
newDt.TableName = tableData.TableName + "_" + j;
newDt.Clear();
i = 0;
}
if (countOfRows == 0 && i < max)
{
newDs.Tables.Add(newDt);
j++;
newDt = tableData.Clone();
newDt.TableName = tableData.TableName + "_" + j;
newDt.Clear();
i = 0;
}
}
return newDs;
}