【问题标题】:Get N number of columns from datatable c#从数据表c#中获取N个列
【发布时间】:2018-01-05 05:54:56
【问题描述】:

我有一个数据表,我需要在其中获取 n 列。例如:从下面的数据表中,我需要单独获取前 10 列数据并将其放入另一个数据表中。

代码:

DataTable dtRecord = DAL.GetRecords();

我试过了,这没有占用所需的列。

var selectColumns = dtRecord .Columns.Cast<System.Data.DataColumn>().Take(10);

【问题讨论】:

    标签: c# linq datatable


    【解决方案1】:

    你也可以用这个

    private DataTable GetNColumnsFromDataTable(DataTable tblSource, int outputCols)
        {
            DataTable columnOutput = tblSource.Copy();
            if (outputCols > 0 && outputCols < tblSource.Columns.Count)
            {
                while (outputCols < columnOutput.Columns.Count)
                {
                    columnOutput.Columns.RemoveAt(columnOutput.Columns.Count - 1);
                }
            }
            return columnOutput;
        }
    

    【讨论】:

      【解决方案2】:

      你可以这样做:

      var selectColumns = dtRecord.Columns.Cast<DataColumn>().Take(10);
      
      var dtResult = new DataTable();
      
      foreach (var column in selectColumns)
          dtResult.Columns.Add(column.ColumnName);
      
      foreach (DataRow row in dtRecord.Rows)
          dtResult.Rows.Add(row.ItemArray.Take(10).ToArray());
      

      也许你应该创建一个相同类型和相同表达式的列:

      dtResult.Columns.Add(column.ColumnName, column.DataType, column.Expression);
      

      【讨论】:

        【解决方案3】:

        要从一个DataTable 复制到另一个,您可以提取感兴趣的列

        var moveCols = dtRecord.Columns.Cast<DataColumn>().Take(10).Select(c => c.ColumnName).ToArray();
        

        那么你必须在新表中创建新的DataColumns,然后在新表中创建新的DataRows:

        var newTable = new DataTable();
        foreach (var c in moveCols)
            newTable.Columns.Add(c);
        foreach (var r in dtRecord.AsEnumerable())
            newTable.Rows.Add(moveCols.Select(c => r[c]).ToArray());
        

        你可以在DataTable上做一个扩展方法:

        public static DataTable Slice(this DataTable dt, params string[] colnames) {
            var newTable = new DataTable();
            foreach (var c in colnames)
                newTable.Columns.Add(c, dt.Columns[c].DataType);
        
            foreach (var r in dt.AsEnumerable())
                newTable.Rows.Add(colnames.Select(c => r[c]).ToArray());
        
            return newTable;
        }
        

        现在你可以打电话了

        var newTable = dtRecord.Slice(moveCols);
        

        通过一个不错的扩展方法,您可以从Dictionarys 动态转换为DataTable

        var newTable = dtRecord.AsEnumerable().Select(r => moveCols.ToDictionary(c => c, c => r[c])).AsDataTable();
        

        我还有一些用于转换ExpandoObject 和匿名对象的工具,以及用于将它们动态转换为匿名对象的扩展。这是Dictionarys 到DataTable 的代码:

        public static DataTable AsDataTable(this IEnumerable<IDictionary<string, object>> rows) {
            var dt = new DataTable();
            if (rows.Count() > 0) {
                foreach (var kv in rows.First())
                    dt.Columns.Add(kv.Key, kv.Value.GetType());
        
                foreach (var r in rows)
                    dt.Rows.Add(r.Values.ToArray());
            }
            return dt;
        }
        
        public static DataTable AsDataTable(this IEnumerable<Dictionary<string, object>> rows) => ((IEnumerable<IDictionary<string, object>>)rows).AsDataTable();
        

        【讨论】:

          【解决方案4】:

          获取 10 列:

           var tbl = new System.Data.DataTable();
          var cols = tbl.Columns.Cast<System.Data.DataColumn>().Take(10);
          // if you wish to get first 10 columns...
          

          如果要获取数据,则必须遍历列才能获取数据。

          var data = cols.SelectMany(x => tbl.Rows.Cast().Take(10).Select(y => y[x]));
          

          当然,这会将所有数据转储到一个 ienumerable 中,如果你想使用强类型对象或一维数组的列表,相信它相当简单,例如:

          var data2 = cols.Select(x => tbl.Rows.Cast().Take(10).Select(y => y[x]).ToArray());
          

          【讨论】:

          • 我在 cast() 中遇到错误。将 system.collection.IEnumerable 的元素转换为指定类型。
          • 你可以用 Cast() 替换它
          猜你喜欢
          • 1970-01-01
          • 2019-08-01
          • 1970-01-01
          • 2019-07-27
          • 2013-06-25
          • 2010-09-07
          • 2019-09-05
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多