2017-02-24 22 views
0

我已經完成了對此的研究,但是沒有找到任何結果做我正在尋找的內容。在代碼中訪問DataTable中列的內容

假設我有一個從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)是正確的語法

回答

1

(參照對方的回答)首先進行訪問,請注意,不需要單獨聲明用於循環的臨時變量。你可以聲明類型爲For...的一部分:

For Each row As DataRow In Dt.Rows 

這比編碼風格的問題更。上面的變量row只存在於For EachNext之間。在另一個答案中聲明,更長的方法可導致tmp,tmp1等每種不同的類型,這些類型僅用於一次不同的循環。

然後,有許多的LINQ的方法,可以讓你的列表,你沒有你寫一個循環都:

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

隨着Option Infer,你甚至都不需要聲明carbsList(of Int32) ,但你可以:

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

這很有效。我只是不明白select函數如何在參數中使用函數。您推薦閱讀的任何資料來進一步瞭解? – robotHamster

+1

它是[Lambda表達式](https://msdn.microsoft.com/zh-cn/library/bb531253.aspx)。它提供了*選擇*的實際邏輯。許多linq方法將採用/或需要一個lambda來提供實際的邏輯。請注意,'q.Field(Of ...)'是另一個將所選列轉換爲特定類型的linq擴展。他們一起可以將簡單的循環簡化爲幾乎沒有任何內容,或者用很少的代碼執行更復雜的任務[這是一個c#示例](http://stackoverflow.com/a/39082249/1070452)刪除2個CSV文件中的模糊('q =>'是'Function(q)'的c#形式)。 – Plutonix

+0

非常感謝@Plutonix,我會確保我在這個週末完成所有這些,看起來我可以使用這個 – robotHamster

0

我發現我一直在尋找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)供日後使用:)