如何从 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 中获取一列值的列表?的主要内容,如果未能解决你的问题,请参考以下文章

显示2个不同实体表的数据表需要从数据库表中获取另一列值

如何获取DataTable某一列的某个值在那一行

如何判断当前修改过的datatable的某一列值是否为int型或double类型

如何获取DATATABLE中的某一列某一行的值

c# 如何从datatable中取出某列的值并去除这一列的相同值,并将这列添加到新的表中

添加具有另一列值的 len() 的 DataFrame 列