首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将数据表拆分为多个固定大小的表

问将数据表拆分为多个固定大小的表
EN

Stack Overflow用户
提问于 2016-01-07 19:50:38
回答 5查看 33.9K关注 0票数 12

我有一个数据表,里面有1123条记录。我想把这张桌子分成五个固定大小的单独数据表。每个表的大小限制为225。

因此,结果数据的大小将是:

代码语言:javascript
复制
DT1 : 225 rows
DT2 : 225 rows
DT3 : 225 rows
DT4 : 225 rows
DT5 : 223 rows (remaining rows)

我找到了如何使用LINQ 这里根据列值拆分数据表。

我还找到了一种将datatable拆分为多个表( 这里 )的方法。想知道是否有更好的方法。张贴代码形成链接:

代码语言:javascript
复制
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拆分为固定大小。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2016-01-07 21:23:33

我曾经做过一个小可拓法

代码语言:javascript
复制
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切割成指定块大小的块。

有了这个,您可以简单地做:

代码语言:javascript
复制
var tables = originalTable.AsEnumerable().ToChunks(225)
                          .Select(rows => rows.CopyToDataTable())

这可以比简单的foreach执行得更好的原因是,list.GetRange是从列表中获取一系列行的非常有效的方法。我很想知道你会发现什么。

票数 22
EN

Stack Overflow用户

发布于 2016-09-21 08:42:03

代码语言:javascript
复制
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;
        }
票数 2
EN

Stack Overflow用户

发布于 2018-07-03 13:19:40

为懒惰的人做这件事的另一种方法:)

代码语言:javascript
复制
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;
        }

客户会这样称呼它:

代码语言:javascript
复制
 var nthDataTable = GetDataTable(model, skip: n, take: m);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34663933

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档