【问题标题】:how to DataTable split into mutiple datatables c#如何将数据表拆分为多个数据表c#
【发布时间】:2018-06-01 11:28:42
【问题描述】:
Gender      Age    Category
--------------------------------
Male     |  10     |   2
Female   |  15     |   1
Trans    |  13     |   3
Female   |  10     |   1
Male     |  20     |   2

我有一个具有上述值的数据表。男性 CategoryId 为 2。在上表中,总共有 2 个男性行。根据Category,合并两行,分成一个单独的数据表。

我需要的输出是:-

数据表 1

Gender      Age    Category
--------------------------------
Male     |  10     |   2
Male     |  20     |   2

数据表2

Gender      Age    Category
--------------------------------
Female   |  15     |   1
Female   |  10     |   1

数据表 3

Gender      Age    Category
--------------------------------
Trans    |  13     |   3

【问题讨论】:

    标签: c# datatable


    【解决方案1】:
    var view = sourceDataTable.DefaultView;
    
    view.RowFilter = "Category = 2";
    var maleDataTable = view.ToTable();
    
    view.RowFilter = "Category = 1";
    var femaleDataTable = view.ToTable();
    
    view.RowFilter = "Category = 3";
    var transDataTable = view.ToTable();
    

    【讨论】:

    • 这可能是最干净的方法。
    【解决方案2】:

    给你:

    List<DataTable> result = DTHead.AsEnumerable()
                .GroupBy(row => row.Field<DataType>("Category"))
                .Select(g => g.CopyToDataTable())
                .ToList();
    

    更多详情请查看此帖:Split Tables

    【讨论】:

      【解决方案3】:

      见下文:

      using System;
      using System.Collections.Generic;
      using System.Linq;
      using System.Text;
      using System.Data;
      
      
      namespace ConsoleApplication48
      {
          class Program
          {
              static void Main(string[] args)
              {
                  DataTable dt = new DataTable();
                  dt.Columns.Add("Gender", typeof(string));
                  dt.Columns.Add("Age", typeof(int));
                  dt.Columns.Add("Category", typeof(int));
      
                  dt.Rows.Add(new object[] {"Male", 10, 2});
                  dt.Rows.Add(new object[] {"Female", 15, 1});
                  dt.Rows.Add(new object[] {"Trans", 13, 3});
                  dt.Rows.Add(new object[] {"Female", 10, 1});
                  dt.Rows.Add(new object[] {"Male", 20, 2});
      
                  DataTable dt1 = dt.AsEnumerable().Where(x => x.Field<string>("Gender") == "Male").CopyToDataTable();
                  DataTable dt2 = dt.AsEnumerable().Where(x => x.Field<string>("Gender") == "Feale").CopyToDataTable();
                  DataTable dt3 = dt.AsEnumerable().Where(x => x.Field<string>("Gender") == "Trans").CopyToDataTable();
      
      
              }
      
          }
      
      }
      

      这是一个更通用的解决方案,可以在列中获取每种类型:

      using System;
      using System.Collections.Generic;
      using System.Linq;
      using System.Text;
      using System.Data;
      
      
      namespace ConsoleApplication48
      {
          class Program
          {
              static void Main(string[] args)
              {
                  DataTable dt = new DataTable();
                  dt.Columns.Add("Gender", typeof(string));
                  dt.Columns.Add("Age", typeof(int));
                  dt.Columns.Add("Category", typeof(int));
      
                  dt.Rows.Add(new object[] { "Male", 10, 2 });
                  dt.Rows.Add(new object[] { "Female", 15, 1 });
                  dt.Rows.Add(new object[] { "Trans", 13, 3 });
                  dt.Rows.Add(new object[] { "Female", 10, 1 });
                  dt.Rows.Add(new object[] { "Male", 20, 2 });
      
                  //updated code
                  string[] rowNames = dt.AsEnumerable().Select(x => x.Field<string>("Gender")).Distinct().ToArray();
                  DataSet ds = new DataSet();
      
                  foreach (string gender in rowNames)
                  {
                      DataTable newDt = dt.AsEnumerable().Where(x => x.Field<string>("Gender") == gender).CopyToDataTable();
                      newDt.TableName = gender;
                      ds.Tables.Add(newDt);
      
                  }
              }
      
          }
      
      }
      

      【讨论】:

      • 但我的数据表是动态的。有时会获得更多具有不同值的行。
      • 代码适用于任意数量的行。我刚刚发布了示例数据来测试代码。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-12
      • 1970-01-01
      • 2013-08-04
      • 2022-01-07
      • 2020-04-23
      • 1970-01-01
      相关资源
      最近更新 更多