2009-07-03 81 views

回答

2

只能遍历行,如Utaal noted in this answer

您可能认为DataTable.DefaultView.RowFilter将支持分组,但它不支持它(它主要提供Where子句的等效功能,包含一些基本聚合 - 虽然不是简单的分组)。

3

据我所知,没有直接的方法来获得这些;但for循环非常简单,显然不会比其他任何东西更耗费资源。

+0

这就是我的想法。我希望这可以成为一种方式。谢谢。 – 2009-07-03 17:04:55

0

除了Utaal的回答,您可以使用查询的结果填充新的DataTable对象,该查询只选择原始数据源中的一列,假设它是RDBMS。这样做的好处是可以让你指定易于在代码中表达的东西,但易于在SQL中表达,如DISTINCT查询。

11

为什么不使用LINQ?对于没有相同限制的人来说,这里有三种方法可以做到这一点,最底层的两种都使用LINQ。

C#

List<object> colValues = new List<object>(); 

//for loop 
foreach (DataRow row in dt.Rows) { 
    colValues.Add(row["ColumnName"]); 
} 

//LINQ Query Syntax 
colValues = (from DataRow row in dt.Rows select row["ColumnName"]).ToList(); 

//LINQ Method Syntax 
colValues = dt.AsEnumerable().Select(r => r["ColumnName"]).ToList(); 

VB

Dim colValues As New List(Of Object) 

'for loop 
For Each row As DataRow In dt.Rows 
    colValues.Add(row("ColumnName")) 
Next 

'LINQ Query Syntax 
colValues = (From row As DataRow In dt.Rows Select row("ColumnName")).ToList 

'LINQ Method Syntax 
colValues = dt.Rows.AsEnumerable.Select(Function(r) r("ColumnName")).ToList 

要使用AsEnumerable方法上DataTable,你必须有一个参考其添加System.Data.DataSetExtensions LINQ extension methods。否则,只需将DataTableRows属性作为DataRow类型(您不必使用查询语法执行此操作,因为它会自动为您投射)。

+0

我无法在过时的.NET Compact Framework应用程序中使用LINQ。但是你的答案可能对其他人有用。 – 2013-07-11 18:14:09