将数据表转换为IList c#

时间:2012-07-05 07:08:44

标签: c# linq lambda

我有一个将数据表转换为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个不同的代码段中具有良好的性能。请讨论。感谢

6 个答案:

答案 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()函数返回一个字典列表。
  • 第二个示例只是使用DataRows填充列表,结果没有优于使用数据表的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循环略慢......并且在处理小数据集时,这是一个微不足道的缓慢。我现在正在时间允许的情况下对这个主题进行一些独立的统计分析。