使用 (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<DataColumn>
。其他部分应该很明显。
【讨论】:
我是 linq/lamda ex 的新手。这看起来不错。还有一个问题,我如何在 1 lamda 表达式中放置条件(其中 dc.ColumnName != "ABC")。在 linq 中我可以使用 where。 就像这样:string[] columnNames = dt.Columns.Cast<DataColumn>().Where(x => x.ColumnName != "ABC").Select(x => 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 的所有列名放入字符串数组的主要内容,如果未能解决你的问题,请参考以下文章
将 hive 表卸载到。使用 Spark 或 pyspark 或 python 的 dat 文件