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 cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.