รับชื่อคอลัมน์ทั้งหมดของ DataTable ลงในสตริงอาร์เรย์โดยใช้ (LINQ / Predicate)


109

ฉันรู้ว่าเราสามารถทำได้อย่างง่ายดายโดยการวนซ้ำแบบธรรมดา แต่ฉันต้องการติดตาม LINQ / Predicate นี้หรือไม่

string[] columnNames = dt.Columns.?

or

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

คำตอบ:


223

ลองสิ่งนี้ (ไวยากรณ์วิธี LINQ):

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

หรือในไวยากรณ์ LINQ Query:

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

Castเป็นสิ่งจำเป็นเพราะคอลัมน์เป็นประเภท DataColumnCollection ซึ่งเป็นไม่ได้IEnumerable IEnumerable<DataColumn>ส่วนอื่น ๆ ควรจะเห็นได้ชัด


ฉันเป็นมือใหม่ใน linq / lamda ex แบบนี้ก็ดูดี อีกหนึ่งคำถามฉันจะวาง condation (โดยที่ dc.ColumnName! = "ABC") ใน 1 นิพจน์ lamda ได้อย่างไร ใน linq ฉันสามารถใช้ที่ไหน
Lalit

เช่นนี้: string[] columnNames = dt.Columns.Cast<DataColumn>().Where(x => x.ColumnName != "ABC").Select(x => x.ColumnName).ToArray();
Daniel Hilgarth

1
@Tizz: โปรดโพสต์เป็นคำถามใหม่และใส่รายละเอียดรหัสของคุณ แต่โดยพื้นฐานแล้ว: DataGrid ไม่เหมือนกับ DataTable
Daniel Hilgarth

3
@FLICKER: ความคิดบางอย่างยังคงเป็นสิ่งจำเป็นในฐานะนักพัฒนา คุณมีสมอง ใช้มัน.
Daniel Hilgarth

1
อืม. ดูแค่ผลโหวต เห็นได้ชัดว่าปัญหาอยู่ที่คุณไม่ใช่กับรหัส ไปหมุนรอบที่อื่น
Daniel Hilgarth

17

ใช้

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

1
ในตอนท้ายสิ่งนี้ทำให้เกิดข้อยกเว้นสองประการ: ไม่สามารถแปลงจาก DataColumnCollection เป็น EnumerableRowCollection และ DataColumnCollection ไม่มีคำจำกัดความสำหรับ Cast

4
@ จอนฉันคิดว่าคุณลืมเพิ่ม 'โดยใช้ System.Linq;' เพื่อการใช้งานของคุณ ฉันเพิ่งทดสอบรหัสของฉันและฉันได้รับข้อยกเว้นที่คุณพูดถึงเมื่อ 'ใช้ System.Linq;' ไม่ได้อยู่ที่นั่น
Sem Vanmeenen

ดู๊! คุณค่อนข้างถูกต้อง ตลกดีที่usingคำสั่งนั้นถูกเพิ่มโดยอัตโนมัติบ่อยครั้งที่ฉันไม่เคยตรวจสอบมัน

4

ฉันขอแนะนำให้ใช้วิธีการขยายดังกล่าว:

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.