ลบคอลัมน์จาก DataTable ใน C #


113

ฉันมีชุดข้อมูลซึ่งฉันได้รับ DataTable จากที่ฉันถูกส่งกลับจากการเรียกใช้ฟังก์ชัน มี 15-20 คอลัมน์ แต่ฉันต้องการข้อมูลเพียง 10 คอลัมน์

มีวิธีลบคอลัมน์เหล่านั้นที่ฉันไม่ต้องการคัดลอก DataTable ไปยังคอลัมน์อื่นที่มีเฉพาะคอลัมน์ที่กำหนดไว้ที่ฉันต้องการหรือดีกว่าถ้าทำซ้ำคอลเลกชันและใช้คอลัมน์ที่ฉันต้องการ

ฉันต้องเขียนค่าลงในไฟล์ข้อมูลที่มีความยาวคงที่


ฉันไม่สามารถควบคุมชุดข้อมูลที่ฉันได้รับ สิ่งเดียวที่ฉันรู้คือมันมีทุกอย่าง
Brian G

คำตอบ:


302

นอกเหนือจากการ จำกัด คอลัมน์ที่เลือกเพื่อลดแบนด์วิดท์และหน่วยความจำ:

DataTable t;
t.Columns.Remove("columnName");
t.Columns.RemoveAt(columnIndex);

13
เพียงชี้แจง: นี้ยังทำงานเมื่อDataTableแถวที่มีอยู่แล้วได้ไม่เพียง DataTableแต่ในที่ว่างเปล่า
Uwe Keim

23

หากต้องการลบคอลัมน์ทั้งหมดหลังจากคอลัมน์ที่คุณต้องการโค้ดด้านล่างควรใช้งานได้ จะลบออกที่ดัชนี 10 (จำคอลัมน์เป็น 0 ตาม) จนกว่าจำนวนคอลัมน์จะเท่ากับ 10 หรือน้อยกว่า

DataTable dt;
int desiredSize = 10;

while (dt.Columns.Count > desiredSize)
{
   dt.Columns.RemoveAt(desiredSize);
}

1
แค่ 2c ของฉันฉันไม่ชอบการแก้ปัญหานี้การทำงานกับดัชนีคอลัมน์จะนำไปสู่การดูแลรักษาฝันร้าย ..
Roberto

1
คำถามประกอบด้วยข้อความต่อไปนี้: ".. คอลัมน์ที่กำหนดว่าฉันต้องการ .. " ดังนั้นหมายความว่าคอลัมน์ที่จำเป็นไม่จำเป็นต้องเรียงตามลำดับด้วยซ้ำดังนั้นจึงไม่สามารถพูดได้ว่า "ฉันต้องการ 10 คอลัมน์แรก" ด้วยเหตุนี้การแก้ปัญหาจึงต้องมีอาร์เรย์ของชื่อคอลัมน์ที่เขาต้องการจากนั้นเราสามารถกำจัดคนอื่น ๆ ทั้งหมดที่ไม่ตกอยู่ในชุดชื่อที่ "กำหนด" นี้ วิธีต่างๆในการดำเนินการนี้ จาก foreach loop อย่างง่ายไปจนถึง query หรือ linq โดยใช้ IN
Roberto

3

คำถามถูกทำเครื่องหมายว่าตอบแล้ว แต่ฉันเดาว่าคำถามระบุว่าบุคคลนั้นต้องการลบหลายคอลัมน์ออกจากไฟล์DataTable.

ดังนั้นนี่คือสิ่งที่ฉันทำเมื่อฉันเจอปัญหาเดียวกัน

string[] ColumnsToBeDeleted = { "col1", "col2", "col3", "col4" };

foreach (string ColName in ColumnsToBeDeleted)
{
    if (dt.Columns.Contains(ColName))
        dt.Columns.Remove(ColName);
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.