【问题标题】:Access the contents of a column in a DataTable in code在代码中访问 DataTable 中列的内容
【发布时间】:2017-07-15 18:10:11
【问题描述】:

我对此进行了研究,但没有找到符合我要求的结果。

假设我有一个从 MySql 数据库填充的 DataTable,在另一个函数中,我想访问其中一列并将值分配给一个变量(循环中的一个)

一些代码来说明我正在尝试做的事情:

Dim adapter As New MySqlDataAdapter
Dim dt As New DataTable
Dim intList As New List(Of Integer)
.......
.......
adapter.fill(dt)
.......
.......
dim col = dt.Columns(1)
populate the list here with the contents of the column

编辑我不完全确定Columns(1) 是正确的语法

【问题讨论】:

    标签: mysql vb.net datatable


    【解决方案1】:

    (参考另一个答案)首先,请注意,无需单独声明用于循环的临时变量。您可以将类型声明为For... 的一部分:

    For Each row As DataRow In Dt.Rows
    

    这不仅仅是编码风格的问题。上面的row 变量只存在于For EachNext 之间。正如在另一个答案中声明的那样,一个更冗长的方法可能会导致 tmptmp1 等每种不同的类型,它们只用于不同的循环一次。

    然后,有许多 linq 方法可以为您获取列表,而无需您编写循环:

    Dim carbs = dt.AsEnumerable().
                      Select(Function(q) q.Field(Of Int32)("Carbs")).
                      ToList()
    

    使用Option Infer,您甚至不需要将carbs 声明为List(of Int32),但您可以:

    Dim carbs As List(Of Int32) = dt.AsEnumerable(). ...
    

    【讨论】:

    • 这非常非常有效。我只是不明白 select 函数是如何通过在参数中使用函数来工作的。您推荐阅读任何资源以进一步了解这一点?
    • 这是一个Lambda Expression。它为 what 提供了选择的实际逻辑。许多很多 linq 方法将采用/或需要 lambda 来提供实际逻辑。请注意,q.Field(Of ...) 是另一个 linq 扩展,用于将所选列强制转换为特定类型。它们一起可以将简单的循环减少到几乎没有,或者用很少的代码执行更复杂的任务。 This is a c# example 删除 2 个 CSV 文件中的欺骗(q =>Function (q) 的 c# 形式)。
    • 非常感谢@Plutonix,我会确保我这个周末完成所有这些,看起来我可以使用它减少很多代码
    • 起点可能是Extension Methods,然后根据需要使用lambdas来实现它们。
    【解决方案2】:

    我找到了我正在寻找的东西 here,我不知道我是怎么错过的。

    最后的代码如下:

        Dim carbsInvolved As New List(Of Integer)
        Dim row As DataRow
        For Each row In dt.Rows
            carbsInvolved.Add(row.Item(1))
        Next
    

    然后carbsInvolved.Item(index)可以访问列表中的数字以供以后使用:)

    【讨论】:

      猜你喜欢
      • 2019-01-05
      • 2012-08-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-14
      • 2018-05-20
      • 2021-12-20
      • 2012-01-04
      相关资源
      最近更新 更多