使用VB.NET中的LINQ从数据表填充List(Of String)

wel*_*tty 3 linq vb.net

所以我有一个看起来或多或少的DataTable

 Column 0      |  Column 1 
 Something     |  Something Else 
 Another Thing |  Another Something Else
Run Code Online (Sandbox Code Playgroud)

我想把第0列中的所有内容放入List(Of String)中

我可以

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

但那已经过时了.我想要做

returnValue = (From r In dt.Rows Select DirectCast(r, DataRow).Item(0)).ToList
Run Code Online (Sandbox Code Playgroud)

但这给了我一个(对象)列表.

我怎样才能直接创建一个列表(String)

(DirectCast就在那里,因为我有Option Strict On)

One*_*Day 7

它位于数据集合中,因此我们需要将其抛弃.

Select询问哪个字段中的函数是您想要的来自对象的对象.

returnValue = dt.Rows.Cast(Of DataRow).Select(Function(dr) dr(0).ToString).ToList
Run Code Online (Sandbox Code Playgroud)


Hei*_*nzi 5

dt.Rows来自 .NET 泛型之前,因此它不会返回IEnumerable(Of DataRow). 但是,有一个扩展方法DataTable.AsEnumerable,它完全符合您的需要:

returnValue = (From r In dt.AsEnumerable() Select r.Field(Of String)(0)).ToList()
Run Code Online (Sandbox Code Playgroud)

请注意,我的示例还使用了DataRow.Field扩展方法,该方法允许对 DataRow 字段进行类型安全的访问,而无需显式强制转换(即使使用 Option Strict On)。


Mar*_*ark 2

感谢@Heinzi 的回答。我用它来编写我自己的示例,我将在下面发布该示例。这是一个完整的 VB 程序示例,对于不太高级的用户来说可能会更好。

我已经对其进行了测试并验证它是否有效。谢谢你!

Sub Main
    
    Dim dataTable1 As New DataTable
    Dim listOfString As New List(Of String)
    
    dataTable1.Columns.Add("DT Column Title" , GetType(String))
    
    dataTable1.Rows.Add("1234")
    dataTable1.Rows.Add("1235")
    dataTable1.Rows.Add("1236")
    dataTable1.Rows.Add("1237")
    
    listOfString = (From item In dataTable1.AsEnumerable() Select item.Field(Of String)(0)).ToList()
    
End Sub
Run Code Online (Sandbox Code Playgroud)