使用 (LINQ/Predicate) 将 DataTable 的所有列名放入字符串数组

Posted

技术标签:

【中文标题】使用 (LINQ/Predicate) 将 DataTable 的所有列名放入字符串数组【英文标题】:Get all column names of a DataTable into string array using (LINQ/Predicate) 【发布时间】:2011-06-28 22:01:01 【问题描述】:

我知道我们可以通过一个简单的循环轻松地做到这一点,但我想说服这个 LINQ/Predicate?

string[] columnNames = dt.Columns.?

or

string[] columnNames = from DataColumn dc in dt.Columns select dc.name;

【问题讨论】:

【参考方案1】:

试试这个(LINQ 方法语法):

string[] columnNames = dt.Columns.Cast<DataColumn>()
                                 .Select(x => x.ColumnName)
                                 .ToArray();  

或在 LINQ 查询语法中:

string[] columnNames = (from dc in dt.Columns.Cast<DataColumn>()
                        select dc.ColumnName).ToArray();

Cast 是必需的,因为 Columns 的类型是 DataColumnCollection,它是 IEnumerable,而不是 IEnumerable&lt;DataColumn&gt;。其他部分应该很明显。

【讨论】:

我是 linq/lamda ex 的新手。这看起来不错。还有一个问题,我如何在 1 lamda 表达式中放置条件(其中 dc.ColumnName != "ABC")。在 linq 中我可以使用 where。 就像这样:string[] columnNames = dt.Columns.Cast&lt;DataColumn&gt;().Where(x =&gt; x.ColumnName != "ABC").Select(x =&gt; x.ColumnName).ToArray(); @Tizz:请将其作为一个新问题发布并包含您的代码的详细信息。但本质上:DataGrid 与 DataTable 不同。 @FLICKER:作为开发人员,仍然需要一些思考。你有脑子。使用它。 嗯嗯。只看票数。显然,问题出在你身上,而不是代码上。去其他地方巨魔【参考方案2】:

使用

var arrayNames = (from DataColumn x 
                  in dt.Columns.Cast<DataColumn>()
                  select x.ColumnName).ToArray();

【讨论】:

在我看来,这会引发两个异常:无法从 DataColumnCollection 转换为 EnumerableRowCollection 并且 DataColumnCollection 不包含 Cast 的定义。 @Jon 我想你忘了添加“使用 System.Linq;”到你的用途。我刚刚测试了我的代码,我得到了你在“使用 System.Linq;”时提到的异常。不在那里。 噢!你说得很对;有趣的是,using 语句经常自动添加,我从未想过要检查它。【参考方案3】:

我建议使用这样的扩展方法:

public static class DataColumnCollectionExtensions

    public static IEnumerable<DataColumn> AsEnumerable(this DataColumnCollection source)
    
        return source.Cast<DataColumn>();
    

因此:

string[] columnNames = dataTable.Columns.AsEnumerable().Select(column => column.Name).ToArray();

您还可以为DataTable 类实现另外一种扩展方法以减少代码:

public static class DataTableExtensions

    public static IEnumerable<DataColumn> GetColumns(this DataTable source)
    
        return source.Columns.AsEnumerable();
    

并按如下方式使用:

string[] columnNames = dataTable.GetColumns().Select(column => column.Name).ToArray();

【讨论】:

【参考方案4】:
List<String> lsColumns = new List<string>();

if(dt.Rows.Count>0)

    var count = dt.Rows[0].Table.Columns.Count;

    for (int i = 0; i < count;i++ )
    
        lsColumns.Add(Convert.ToString(dt.Rows[0][i]));
    

【讨论】:

以上是关于使用 (LINQ/Predicate) 将 DataTable 的所有列名放入字符串数组的主要内容,如果未能解决你的问题,请参考以下文章

使用 Matlab 将矩阵保存到 .dat 文件 [关闭]

将 dat 文件导入 R

如何锁定滑块并防止使用鼠标将值更新到 dat.GUI 菜单

将 hive 表卸载到。使用 Spark 或 pyspark 或 python 的 dat 文件

Mapinfo + Java:一种解密DAT文件中坐标的方法?

将数据保存为 *.dat 文件?