Lấy tất cả các tên cột của DataTable vào mảng chuỗi bằng cách sử dụng (LINQ / Predicate)


107

Tôi biết chúng ta có thể dễ dàng thực hiện việc này bằng một vòng lặp đơn giản, nhưng tôi muốn duy trì LINQ / Vị từ này?

string[] columnNames = dt.Columns.?

or

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

Câu trả lời:


220

Hãy thử điều này (cú pháp phương pháp LINQ):

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

hoặc trong cú pháp truy vấn LINQ:

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

Castlà bắt buộc, bởi vì Cột thuộc loại DataColumnCollection IEnumerable, không phải IEnumerable<DataColumn>. Các phần khác nên rõ ràng.


tôi là một thành viên mới trong linq / lamda ex. Nhìn có vẻ tốt. một câu hỏi nữa, làm thế nào tôi có thể đặt điều khiển (trong đó dc.ColumnName! = "ABC") trong 1 biểu thức lamda. trong linq tôi có thể sử dụng ở đâu.
— Lalit

Giống như thế này: string[] columnNames = dt.Columns.Cast<DataColumn>().Where(x => x.ColumnName != "ABC").Select(x => x.ColumnName).ToArray();
— Daniel Hilgarth

1
@Tizz: Vui lòng đăng nó dưới dạng một câu hỏi mới và bao gồm chi tiết về mã của bạn. Nhưng về cơ bản: DataGrid không giống như DataTable.
— Daniel Hilgarth

3
@FLICKER: Một nhà phát triển vẫn cần phải có một số tư duy. Bạn có một bộ não. Sử dụng nó.
— Daniel Hilgarth

1
À tốt. Chỉ cần nhìn vào các phiếu bầu. Rõ ràng, vấn đề là ở bạn, không phải với mã. Đi troll ở một nơi khác
— Daniel Hilgarth

17

Sử dụng

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

1
Cuối cùng của tôi, điều này ném hai Ngoại lệ: không thể chuyển đổi từ DataColumnCollection thành EnumerableRowCollection và DataColumnCollection không chứa định nghĩa cho Truyền.

4
@Jon Tôi nghĩ bạn bắt đầu thêm 'using System.Linq;' cho việc sử dụng của bạn. Tôi vừa kiểm tra mã của mình và tôi nhận được các ngoại lệ mà bạn đề cập khi 'sử dụng System.Linq;' không có ở đó.
— Sem Vanmeenen

Doh! Bạn khá chính xác; buồn cười, usingcâu lệnh đó được tự động thêm vào thường xuyên, tôi chưa bao giờ nghĩ đến việc kiểm tra nó.

4

Tôi khuyên bạn nên sử dụng phương pháp mở rộng như vậy:

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

Và do đó:

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

Bạn cũng có thể triển khai thêm một phương thức mở rộng cho DataTablelớp để giảm mã:

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

Và sử dụng nó như sau:

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

0
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]));
    }
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookie và Chính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.