Получить все имена столбцов DataTable в массив строк с помощью (LINQ / Predicate)
Я знаю, что мы можем легко сделать это с помощью простого цикла, но я хочу продолжить этот LINQ/предикат?
string[] columnNames = dt.Columns.?
or
string[] columnNames = from DataColumn dc in dt.Columns select dc.name;
4 ответа:
попробуйте это (синтаксис метода 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
требуется, потому что столбцы имеют тип DataColumnCollection, который являетсяIEnumerable
, а неIEnumerable<DataColumn>
. Остальные части должны быть очевидны.
Я бы предложил использовать такой метод расширения:
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();