Удаление столбца набора данных C # с помощью LINQ - PullRequest
2 голосов
/ 11 ноября 2011

У меня есть набор данных с несколькими столбцами, и все, что я хочу сделать, - это удалить все столбцы, кроме тех, которые есть в списке.

Так, например, в наборе данных есть столбцы "ColA", "ColB" и "ColC". Мой список содержит 1 элемент, строка "ColB". То, что я хочу сделать, это либо удалить «ColA» и «ColC», либо сказать, чтобы оставить только «ColB».

Можно ли это осуществить с помощью LINQ или вообще? Я не уверен, как мой динамически генерируемый список строк мог уничтожить столбцы в исходном наборе данных.

Ответы [ 2 ]

1 голос
/ 11 ноября 2011
var columnsFromTable = dt.Columns;// get all your column here
var columnsFromCollection = new string[] { "ColB" };//column to remove

Array.ForEach(columnsFromCollection,col=>
dt.Columns.Remove(col));
0 голосов
/ 11 ноября 2011

Для выполнения «классической» проекции требуется поддержка компилятора

var res = myList.Select(d => new {d.ColB});

(код выше создает анонимный класс с единственным свойством с именем ColB)

Однако, если скорость выполнения не слишком важна для вас, можно использовать ExpandoObject вместо класса, сгенерированного компилятором, например:

var columnList = new[] {"ColB"};
var res = myList.Select(d => Project(d, columnList));
...
static ExpandoObject Project(MyDataObject d, string[] columns) {
    var res = new ExpandoObject();
    // Using reflection here is a much better solution
    if (Array.IndexOf(columns, "ColA") >= 0) res.ColA = d.ColA;
    if (Array.IndexOf(columns, "ColB") >= 0) res.ColB = d.ColB;
    if (Array.IndexOf(columns, "ColC") >= 0) res.ColC = d.ColC;
    return res;
}
...