如何从 DataTable 中获取一列值的列表?
Posted
技术标签:
【中文标题】如何从 DataTable 中获取一列值的列表?【英文标题】:How to get list of one column values from DataTable? 【发布时间】:2014-07-07 07:11:45 【问题描述】:我有数据表。
DataTable dt = new DataTable();
dt.Columns.Add(new DataColumn("id", Type.GetType("System.Int32")));
dt.Columns.Add(new DataColumn("name", Type.GetType("System.String")));
// more columns here
我需要“id”值列表。
我可以在我的 DataTable 中的所有行上不使用循环并且不使用 Linq 吗?
编辑:
在与 Sergei 进行小幅讨论后,我还是决定使用循环。
【问题讨论】:
【参考方案1】:List<int> ids = dt.AsEnumerable().Select(r => r.Field<int>("id")).ToList();
或
int[] ids = dt.AsEnumerable().Select(r => r.Field<int>("id")).ToArray();
【讨论】:
这个答案有两个问题:1) LINQ 在 C# 2.0 / .NET Framework 2.0 中不可用。 2) OP 明确表示他们不想使用 LINQ。【参考方案2】:您可以使用 Linq to DataTable:
var ids = dt.AsEnumerable().Select(r => r.Field<int>("id")).ToList();
更新:没有 Linq
List<int> ids = new List<int>(dt.Rows.Count);
foreach(DataRow row in dt.Rows)
ids.Add((int)row["id"]);
请注意,为了提高效率,最好使用row[index]
而不是row[columnName]
。第一个只是从列数组中按索引获取列。后者从将名称映射到索引的内部字典中获取列索引,然后才按索引获取列。
要注意的另一件事是使用行数初始化列表的容量。如果您不这样做,则列表的内部数组将被重新创建并复制多次(取决于行数)。
最后要说的是 - 使用大表(如果可能)最有效的方法是在服务器端过滤数据。
【讨论】:
@TimSchmelter 使用 C#2 的扩展方法? :) 第一个是 Linq,第二个是循环。这是我想要避免的。 @Kamil 我敢打赌最初没有循环限制。你能解释一下循环有什么问题吗? 我的问题文本在我编辑时没有更改 - 我只是在这些限制上添加了粗体。您可以单击“已编辑……分钟前”并查看编辑历史记录。 不要删除这个答案,它不适合我,但也许有人会需要它。以上是关于如何从 DataTable 中获取一列值的列表?的主要内容,如果未能解决你的问题,请参考以下文章
如何判断当前修改过的datatable的某一列值是否为int型或double类型