2015-06-04 64 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