我有一个数据表,里面有1123条记录。我想把这张桌子分成五个固定大小的单独数据表。每个表的大小限制为225。
因此,结果数据的大小将是:
DT1 : 225 rows
DT2 : 225 rows
DT3 : 225 rows
DT4 : 225 rows
DT5 : 223 rows (remaining rows)我找到了如何使用LINQ 这里根据列值拆分数据表。
我还找到了一种将datatable拆分为多个表( 这里 )的方法。想知道是否有更好的方法。张贴代码形成链接:
private static List<DataTable> SplitTable(DataTable originalTable, int batchSize)
{
List<DataTable> tables = new List<DataTable>();
int i = 0;
int j = 1;
DataTable newDt = originalTable.Clone();
newDt.TableName = "Table_" + j;
newDt.Clear();
foreach (DataRow row in originalTable.Rows)
{
DataRow newRow = newDt.NewRow();
newRow.ItemArray = row.ItemArray;
newDt.Rows.Add(newRow);
i++;
if (i == batchSize)
{
tables.Add(newDt);
j++;
newDt = originalTable.Clone();
newDt.TableName = "Table_" + j;
newDt.Clear();
i = 0;
}
}
return tables;
}需要帮助将datatable拆分为固定大小。
发布于 2016-01-07 21:23:33
我曾经做过一个小可拓法
public static IEnumerable<IEnumerable<T>> ToChunks<T>(this IEnumerable<T> enumerable,
int chunkSize)
{
int itemsReturned = 0;
var list = enumerable.ToList(); // Prevent multiple execution of IEnumerable.
int count = list.Count;
while (itemsReturned < count)
{
int currentChunkSize = Math.Min(chunkSize, count - itemsReturned);
yield return list.GetRange(itemsReturned, currentChunkSize);
itemsReturned += currentChunkSize;
}
}它将任何IEnumerable切割成指定块大小的块。
有了这个,您可以简单地做:
var tables = originalTable.AsEnumerable().ToChunks(225)
.Select(rows => rows.CopyToDataTable())这可以比简单的foreach执行得更好的原因是,list.GetRange是从列表中获取一系列行的非常有效的方法。我很想知道你会发现什么。
发布于 2016-09-21 08:42:03
private static List<DataTable> SplitTable(DataTable originalTable, int batchSize)
{
List<DataTable> tables = new List<DataTable>();
int i = 0;
int j = 1;
DataTable newDt = originalTable.Clone();
newDt.TableName = "Table_" + j;
newDt.Clear();
foreach (DataRow row in originalTable.Rows)
{
DataRow newRow = newDt.NewRow();
newRow.ItemArray = row.ItemArray;
newDt.Rows.Add(newRow);
i++;
if (i == batchSize)
{
tables.Add(newDt);
j++;
newDt = originalTable.Clone();
newDt.TableName = "Table_" + j;
newDt.Clear();
i = 0;
}
}
if (newDt.Rows.Count > 0)
{
tables.Add(newDt);
j++;
newDt = originalTable.Clone();
newDt.TableName = "Table_" + j;
newDt.Clear();
}
return tables;
}
foreach (var dt1 in SplitTable(table1, 2))
{
DataTable dt = dt1;
}发布于 2018-07-03 13:19:40
为懒惰的人做这件事的另一种方法:)
private static DataTable GetDataTable<T>(IEnumerable<T> data, int skip, int take)
{
var properties = TypeDescriptor.GetProperties(typeof(T));
var dataTable = new DataTable();
foreach (PropertyDescriptor prop in properties)
dataTable
.Columns
.Add(prop.Name, Nullable.GetUnderlyingType(prop.PropertyType)
?? prop.PropertyType);
foreach (var item in data.Skip(skip).Take(take))
{
var row = dataTable.NewRow();
foreach (PropertyDescriptor prop in properties)
row[prop.Name] = prop.GetValue(item) ?? DBNull.Value;
dataTable.Rows.Add(row);
}
return dataTable;
}客户会这样称呼它:
var nthDataTable = GetDataTable(model, skip: n, take: m);https://stackoverflow.com/questions/34663933
复制相似问题