【问题标题】:How to get list of one column values from DataTable?如何从 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 进行小幅讨论后,我还是决定使用循环。

【问题讨论】:

    标签: c# datatable c#-2.0


    【解决方案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 我敢打赌最初没有循环限制。你能解释一下循环有什么问题吗?
    • 我的问题文本在我编辑时没有更改 - 我只是在这些限制上添加了粗体。您可以单击“已编辑……分钟前”并查看编辑历史记录。
    • 不要删除这个答案,它不适合我,但也许有人会需要它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-05
    • 1970-01-01
    • 2019-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-11
    相关资源
    最近更新 更多