有没有 LINQ 表达式可以将 DataTable 转换为字典?

3
我有一些情况需要进行查询,得到一个数据表格,然后将其转换为以下两种格式之一:
 Dictionary<string, string>

或者
 Dictionary<int, int>

或者

 Dictionary<string, [Someobject]>

我本可以用循环创建自己的函数,但我想看看是否有任何 LINQ 的方法可以将 DataTable 转换为字典,并只传递 2 个 lambda 表达式作为键和值(类似于将 IEnumerable 转换为字典的方式)。

2个回答

9
你可以使用 AsEnumerableToDictionary
例如,如果你想要一个字典,其中键来自 col1,值来自 col2:
table.AsEnumerable()
     .ToDictionary<int, string>(row => row.Field<int>(col1),
                                row => row.Field<string>(col2));

最好使用Field()扩展方法而不是索引和转换。 - Jeff Mercado
@manji - 这段代码在我的电脑上无法编译。它无法解析 Field 属性。我正在使用 .net 3.5,如果这有帮助的话。 - leora
您是否已经添加了对 System.Data.DataSetExtensions.dll 的引用? - manji
@manji - 我之前没有加,但添加后似乎没有改变任何东西。 - leora
即使使用了 using System.Data 指令?它已经包含在3.5中,应该可以工作。 - manji
这段代码不起作用。为键指定一个选择器,为元素指定另一个选择器只适用于ToDictionary()的非泛型版本。 - Krisztián Balla

4
Linq提供了一个名为ToDictionary的扩展方法,听起来像是你所描述的内容。
编辑
至于在DataTable中使用ToDictionary:我不知道为什么不能。
DataTable dt = GetMyDataTable();
return dt.Rows.Cast<DataRow>().ToDictionary(r => r["KeyColumn"], r => r["ValueColumn"]);

你需要添加“cast”(类型转换)是因为DataTable.Rows只是IEnumerable,而不是IEnumerable<DataRow>


我知道(如问题所述)。我想知道是否有一个来自数据表的等价物? - leora
你也可以使用 dt.AsEnumerable() 来获取一个 IEnumerable<DataRow> - Anthony Pegram
@Anthony 是的,这就是为什么我点赞了 @manji 的回答。 :) 已经太久没用 DataSets 工作了! - Matt Hamilton

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接