使用LINQ/Predicate将DataTable的所有列名获取到字符串数组中

139

我知道我们可以通过简单的循环轻松地完成这个任务,但我想追求使用LINQ/Predicate实现?

string[] columnNames = dt.Columns.?

or

string[] columnNames = from DataColumn dc in dt.Columns select dc.name;
4个回答

278

试试这个(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>。其他部分应该很明显。


我仍然收到“无法将类型为'System.Windows.Forms.DataGridViewTextBoxColumn'的对象转换为类型'System.Data.DataColumn'”。发生了什么? - Tizz
1
@Tizz:请将其作为一个新问题发布,并包含您代码的详细信息。但本质上来说:DataGrid并不等同于DataTable。 - Daniel Hilgarth
如果您将前面的代码片段放入一个foreach循环中,它是否会针对每个项目进行所有强制转换?foreach(string item in dt.Columns.Cast<DataColumn>().Select(x=>x.ColumnName).ToArray()) { ... } - Rod
3
作为开发者仍需要一些思考。你有大脑,要好好利用它。 - Daniel Hilgarth
1
嗯,看看投票结果就知道了。显然,问题出在你身上,而不是代码上。去别的地方喷吧。 - Daniel Hilgarth
显示剩余3条评论

19

使用

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

1
在我的端上,这会抛出两个异常:无法将DataColumnCollection转换为EnumerableRowCollection,以及DataColumnCollection不包含Cast的定义。 - user565869
4
@Jon,我认为你忘记将 'using System.Linq;' 添加到你的 usings 中了。我刚刚测试了我的代码,在没有添加 'using System.Linq;' 的情况下,我遇到了你提到的异常。 - Sem Vanmeenen
糟糕!你说得很对;有趣的是,using语句经常自动添加,我从来没有想过要检查它。 - user565869

6

我建议使用如下的扩展方法:

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();

-1
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]));
    }
}

1
这会使完美的解决方案变得更糟和难以理解。 - Gert Arnold

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接