2015-06-04 65 views
2

所以我看起來一個DataTable或多或少像從數據表中VB.NET使用LINQ填充列表(串)

Column 0  | Column 1 
Something  | Something Else 
Another Thing | Another Something Else 

而且我希望把列0一切都變成清單(串)

我能做

Dim returnValue as List(Of String)  
For Each r As DataRow In dt.Rows 
    returnValue.Add(r.Item(0).ToString) 
Next 

但是,這是老搗毀。我想要做

returnValue = (From r In dt.Rows Select DirectCast(r, DataRow).Item(0)).ToList 

但是,這給了我一個列表(對象)。

我如何可以直接創建

(一個String)一個列表(DirectCast是存在的,因爲我有選項嚴格上)

回答

5

這是一個數據行集合中,所以我們需要把鬼趕出去。

Cast

Select功能要求你從鑄造物想要的領域。

returnValue = dt.Rows.Cast(Of DataRow).Select(Function(dr) dr(0).ToString).ToList 
2

dt.Rows是.NET泛型的時間之前,因此它不會返回IEnumerable(Of DataRow)。然而,有一個擴展方法,DataTable.AsEnumerable,這不正是你所需要的:

returnValue = (From r In dt.AsEnumerable() Select r.Field(Of String)(0)).ToList() 

請注意,我的例子也用DataRow.Field擴展方法,它允許的DataRow字段類型安全接入,而無需顯式類型轉換(即使使用Option Strict On也是如此)。

+0

僅供參考:此解決方案無法在.NET 3.5中工作 – George

+0

@George:你是怎麼想的?我一直在.NET 3.5項目中使用這種模式。也許你錯過了對'System.Data.DataSetExtensions'的引用? – Heinzi

+0

我試過這個代碼,它不工作。我有System.Data.DataSetExtensions引用,但我得到的編譯錯誤「ToList」不是'System.Data.EnumerableRowCollection(Of String)'的成員PS:它是一個網站,如果這有什麼區別。我使用VS express 2013和項目是.NET框架3.5 – George