【发布时间】:2011-12-27 04:43:35
【问题描述】:
我有一个包含几列的数据集,我想要做的就是删除除列表中的列之外的所有列。
因此,例如,数据集包含“ColA”、“ColB”和“ColC”列。我的列表包含 1 项,字符串“ColB”。我想要做的是要么删除“ColA”和“ColC”,或者说只保留“ColB”。
是否可以使用 LINQ 甚至一般情况下实现这一点?我不确定我的动态生成的字符串列表如何消除原始数据集上的列。
【问题讨论】:
我有一个包含几列的数据集,我想要做的就是删除除列表中的列之外的所有列。
因此,例如,数据集包含“ColA”、“ColB”和“ColC”列。我的列表包含 1 项,字符串“ColB”。我想要做的是要么删除“ColA”和“ColC”,或者说只保留“ColB”。
是否可以使用 LINQ 甚至一般情况下实现这一点?我不确定我的动态生成的字符串列表如何消除原始数据集上的列。
【问题讨论】:
执行“经典”投影需要编译器支持
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;
}
【讨论】:
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));
【讨论】: