我有一个将数据表转换为ilist的代码。这可能有用,但代码对我来说不是很清楚。这是代码
table.AsEnumerable()
.Select(r => table.Columns.ToDictionary(c => c.ColumnName, c => r[c]))
.ToList();
什么是table.Columns.ToDictionary()......它的作用。 c =>是什么意思? c.ColumnName,c => ř并[c] 什么r [c]返回。我不是很清楚。
我有另一个片段....这里是
var list = new List<DataRow>();
foreach (var row in table.Rows)
list.Add(row);
return list;
此代码对我来说很清楚但我想知道哪个代码在2个不同的代码段中具有良好的性能。请讨论。感谢
答案 0 :(得分:5)
ToDictionary
调用会将每个DataRow
转换为Dictionary<string, object>
,您可以使用它来查找行中任何字段的值。 =>
是lambda expression中使用的语法 - 如果您要使用LINQ进行大量工作,您应该真正了解lambda表达式。
您的第二个片段更简单地写为:
var list = table.Rows.Cast<DataRow>().ToList();
在效率方面 - 第一种形式在构建字典时从行中获取所有数据。如果您只需要查看某些字段,那么这可能会降低效率。另一方面,可能更方便。这取决于你以后用它做什么。在内存方面,第二种形式意味着DataRow
对象本身不能被垃圾收集,而第一种形式之后不需要这些行 - 但是它创建了一个副本所有实际数据。在您的情况下,这是否与您的代码有关。
我不会专注于开始时的性能 - 从使用最简单的代码编写的代码开始,然后检查是否执行足够。
答案 1 :(得分:1)
好吧,简单地说它是一个lambda表达式,转换成一个方法。 r是一个对象,c是它的索引器。这意味着您可以选择r的数组值之一。示例:从表R返回列号8,因此c的值为8.希望它有所帮助。
答案 2 :(得分:1)
他们的结果不同。
简短:
ToDictionary
扩展方法需要两个参数:键和值。在此示例中,关键是列名称(c => c.ColumnName
)。由于此方法是在数据行的Columns
- 集合上调用的,因此c
是一列。第二个参数获取列名称并将其插入当前行,为列提供实际值。因此,您的词典将填充由ColumnName-&gt; Value组成的KeyValuePairs。这是针对每一行完成的。然后,ToList()函数返回一个字典列表。Rows
集合。答案 3 :(得分:1)
如果您使用.Net Framework 3.5,请尝试此操作 代码:
DataTable dt = new DataTable();
var list = dt.Select().ToList();
答案 4 :(得分:0)
table.AsEnumerable()
与整个SECOND代码段非常相似
你可以使用其中任何一个。
代码:
.Select(r => table.Columns.ToDictionary(c => c.ColumnName, c => r[c]))
.ToList();
创建包含每个表行的值的字典。您可能根本不需要这个,因为DataRow已经具有此功能。
答案 5 :(得分:0)
关于代码性能的问题,我同意以前的海报,首先你不应该关心自己的速度。让它工作,然后做对。
然而,基于我在标准foreach循环和LINQ流畅语法之间的基准测试中看到的(有限的)研究,LINQ只比标准的foreach循环略慢......并且在处理小数据集时,这是一个微不足道的缓慢。我现在正在时间允许的情况下对这个主题进行一些独立的统计分析。