如何在DataRow上使用.ToDictionary()扩展方法

14

我需要从DataRow中创建一个Dictionary<string,object>。目前我已经有一些工作,但是我做了太多的事情,并没有利用好.ToDictionary()扩展方法。

请问有人能指导我如何成功实现吗?

以下是我的失败尝试:

var dataDictionary = dataTable.Select(acn + "=" + accountNumber).ToDictionary(key => key.Table.Columns);

这会返回一个 KeyValuePair<DataColumnCollection, DataRow>,但是我需要一个 Dictionary<string,object>

再次提前感谢!


1
您忘记提及您需要什么作为键和值了吗?如果没有这个信息,您的问题并不真正有意义。我将使用通用术语发布一个答案。 - driis
谢谢你的回答 - 我想我可以让它工作。我的关键需要是列名,我的值需要是数据行中该列的值。 - BueKoW
你是选择多行还是只匹配单行? - driis
我正在匹配一行数据。抱歉 - 我的datatable只有一行,这是我从中创建字典的原因,看起来很丑陋。我需要的是像这样的东西:Dictionary<string, string>{{"Acn", "7070707"}, {"Name", "John Smith"}} - BueKoW
4个回答

27

我知道这是老问题了,但对于后来者来说,正确的LINQ表达式是对driis代码的轻微修改:

var dictionary = row.Table.Columns
    .Cast<DataColumn>()
    .ToDictionary(col => col.ColumnName, col => row.Field<string>(col.ColumnName));

8
您需要指定您想要的键,这可能是表中的acn列:
.ToDictionary(row => (string)row["acn"]);

ToDictionary函数有第二个委托参数,如果你想在返回的字典中对值进行转换,则可以使用该参数。

编辑

我将保留原始答案,因为它解释了一般情况。您希望获取单个行; 然后将其列用作键,将列值用作值。以下是如何执行此操作的方法。

 DataRow row = dataTable.Select(acn + "=" + accountNumber).Single(); // You might want SingleOrDefault
 var dataDictionary = row.Table.Columns.ToDictionary(col => col.Name, col => row[col.Name]);

声明:以上内容是在没有编译器的情况下编写的,可能需要进行一些微调。

(免责声明,上述内容是在手头没有编译器的情况下编写的,可能需要进行一些微调。)

以上代码没问题,但是“没有使用编译器编写”。请确保使用@jjoelson的答案。 - Glen Little

2
您IP地址为146.190.162.183,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。
var dictionary = row.Table.Columns
    .Cast<DataColumn>()
    .ToDictionary(col => col.ColumnName, col => row.Field<object>(col.ColumnName));

但稍微简化一下,就是这样的:
var dictionary row.Table.Columns
    .Cast<DataColumn>()
    .ToDictionary(col => col.ColumnName, col => row[col]);

-1

我喜欢LINQ

dataTable.Rows.Cast<DataRow>().Select(e=>e.Table.Columns.Cast<DataColumn>().ToDictionary(col => col.ColumnName, col => e[col.ColumnName]) ).ToList()

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