3

我得到了将数据表转换为 ilist 的代码。这可能有效,但代码对我来说不是很清楚。这是代码

table.AsEnumerable()
.Select(r => table.Columns.ToDictionary(c => c.ColumnName, c => r[c]))
.ToList();

什么是 table.Columns.ToDictionary()...它的作用。c => c.ColumnName 是什么意思,c => r[c] r[c] 返回什么。我不太清楚。

我有另一个片段....这里是

var list = new List<DataRow>();
foreach (var row in table.Rows)
   list.Add(row);

return list;

这段代码对我来说很清楚,但我想知道哪个代码在 2 个不同的片段中具有良好的性能。请讨论。谢谢

4

6 回答 6

5

ToDictionary调用将每个转换DataRowDictionary<string, object>可用于查找行中任何字段的值的 a。=>lambda 表达式中使用的语法- 如果您要使用 LINQ 进行大量工作,您应该真正了解 lambda 表达式。

您的第二个片段将更简单地写为:

var list = table.Rows.Cast<DataRow>().ToList();

在效率方面 - 第一种形式在构建字典时从行中获取所有数据。如果您只需要查看某些字段,这可能会降低效率。另一方面,它可能更方便。这取决于你以后用它做什么。在内存方面,第二种形式意味着DataRow对象本身不能被垃圾收集,而第一种形式不需要之后的行 - 但它创建了所有实际数据的副本。这是否与您的情况相关将再次取决于您的其余代码。

不过,我不会关注一开始的性能——从让应用程序的其余部分编写起来最简单的代码开始,然后检查它的性能是否足够好

于 2012-07-05T07:12:13.217 回答
1

如果您使用 .Net Framework 3.5,请尝试以下代码:

DataTable dt = new DataTable();
var list = dt.Select().ToList();
于 2013-06-17T21:54:44.930 回答
1

简单地说,它是一个转换为方法的 lambda 表达式。r 是一个对象,c 是它的索引器。这意味着您可以选择 r 的数组值之一。示例:从表 R 返回我的第 8 列,因此 c 的值为 8。希望它有所帮助。

于 2012-07-05T07:15:39.080 回答
1

他们的结果是不同的。

短的:

  • 第一条语句创建一个字典列表,其中每个键值对是列名和值。ToDictionary扩展方法需要两个参数:一个键和一个值。在此示例中,关键是列名 ( c => c.ColumnName)。因为此方法是在数据行的Columns-collection 上调用的,所以c是一列。第二个参数获取列名并将其插入当前行,给出该列的实际值。因此,您的字典会充满由 ColumnName->Value 组成的 KeyValuePairs。这是为每一行完成的。之后 ToList() 函数返回一个字典列表。
  • Rows第二个示例仅使用 DataRows 填充列表,结果与使用数据表的集合相比没有优势。
于 2012-07-05T07:15:58.520 回答
0

table.AsEnumerable()与整个 SECOND 代码片段非常相似,您可以使用它们中的任何一个。

编码:

.Select(r => table.Columns.ToDictionary(c => c.ColumnName, c => r[c]))
.ToList();

为每个表行创建具有值的字典。您可能根本不需要它,因为 DataRow 已经具有此功能。

于 2012-07-05T07:20:58.410 回答
0

关于代码性能,我同意之前的发帖者的观点,一开始你不应该关心速度。让它工作,然后把它做好。

但是,根据我在标准 foreach 循环和 LINQ 流畅语法之间的基准测试中看到的(有限)研究,LINQ 仅比标准 foreach 循环稍慢......并且在处理小数据集时,它是一个微不足道的缓慢。如果时间允许,我目前正在对这个主题进行一些独立的统计分析。

于 2012-07-09T14:50:54.057 回答