Usuń kolumny z DataTable w C #

113

Mam zestaw danych, z którego otrzymuję DataTable, z którego jestem przekazywany z wywołania funkcji. Ma 15-20 kolumn, ale chcę tylko 10 kolumn danych.

Czy istnieje sposób, aby usunąć te kolumny, których nie chcę, skopiować DataTable do innej, która ma tylko zdefiniowane kolumny, które chcę, czy po prostu lepiej jest iterować kolekcję i po prostu używać potrzebnych kolumn.

Muszę zapisać wartości do pliku danych o stałej długości.

Brian G.
źródło
Nie mam żadnej kontroli nad zbiorem danych, który otrzymuję. Wiem tylko, że zawiera wszystko.
Brian G,

Odpowiedzi:

302

Oprócz ograniczenia liczby kolumn wybranych w celu zmniejszenia przepustowości i pamięci:

DataTable t;
t.Columns.Remove("columnName");
t.Columns.RemoveAt(columnIndex);
Tom Ritter
źródło
13
Dla wyjaśnienia: Działa to również, gdy DataTablema już istniejące wiersze, nie tylko na pustym DataTable.
Uwe Keim
23

Aby usunąć wszystkie kolumny po tej, którą chcesz, poniższy kod powinien działać. Zostanie usunięty przy indeksie 10 (pamiętaj, że kolumny są oparte na 0), dopóki liczba kolumn nie wyniesie 10 lub mniej.

DataTable dt;
int desiredSize = 10;

while (dt.Columns.Count > desiredSize)
{
   dt.Columns.RemoveAt(desiredSize);
}
Timothy Carter
źródło
1
tylko mój 2c, nie podoba mi się to rozwiązanie, praca z indeksami kolumn prowadzi do koszmaru konserwacji ..
Roberto
1
pytanie zawiera następujące stwierdzenie: „..kolumny zdefiniowane, które chcę…”, co oznacza, że ​​potrzebne kolumny nie muszą być nawet w kolejności sekwencyjnej, więc nie można po prostu powiedzieć „potrzebuję pierwszych 10 kolumn”. Jako takie rozwiązanie musi zawierać tablicę nazw kolumn, które chce, wtedy możemy wyeliminować wszystkie inne, które nie mieszczą się w tym „zdefiniowanym” zestawie nazw. Różne sposoby realizacji tego; od prostej pętli foreach do zapytania lub linq używając IN.
Roberto
3

Pytanie zostało już oznaczone jako odpowiedź, ale wydaje mi się, że pytanie mówi, że osoba chce usunąć wiele kolumn z pliku DataTable.

A więc oto, co zrobiłem, kiedy napotkałem ten sam problem.

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

foreach (string ColName in ColumnsToBeDeleted)
{
    if (dt.Columns.Contains(ColName))
        dt.Columns.Remove(ColName);
}
SU7
źródło