【发布时间】:2013-07-11 21:58:21
【问题描述】:
在 C# 中,是否可以通过简单指令(无 LINQ,无 For cicle)从 DataSet 的所有行中获取特定列的所有值?
【问题讨论】:
在 C# 中,是否可以通过简单指令(无 LINQ,无 For cicle)从 DataSet 的所有行中获取特定列的所有值?
【问题讨论】:
为什么没有 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
要在DataTable 上使用AsEnumerable 方法,您必须拥有对添加LINQ extension methods 的System.Data.DataSetExtensions 的引用。否则,您可以将DataTable 的Rows 属性转换为DataRow 类型(您不必使用查询语法执行此操作,因为它会自动为您转换)。
【讨论】:
仅通过迭代行,如Utaal noted in this answer。
您可能期望DataTable.DefaultView.RowFilter 支持分组,但它不支持(它主要提供与Where 子句等效的功能,并带有一些基本的聚合——尽管不是简单的分组)。
【讨论】:
据我所知,没有直接的方法可以得到这些;但是 for 循环非常简单,显然不会比其他任何东西更耗费资源。
【讨论】:
除了 Utaal 的回答之外,您还可以使用从原始数据源中仅选择一列的查询结果填充一个新的 DataTable 对象,假设它是一个 RDBMS。这样做的好处是可以让您指定在代码中易于表达但在 SQL 中易于表达的内容,例如 DISTINCT 查询。
【讨论】: