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

C# 如何在DataRow上使用.ToDictionary()扩展方法,c#,linq,C#,Linq,我需要一个从数据行生成的字典。我目前有一些方法可以解决这个问题,但我做得太多了,没有使用.ToDictionary()扩展方法 有人能告诉我如何成功地完成这项工作吗 以下是我失败的尝试: var dataDictionary = dataTable.Select(acn + "=" + accountNumber).ToDictionary(key => key.Table.Columns); 这将返回一个KeyValuePair,但我需要一个字典 再次提前感谢 您需要指定所需的键,可能

我需要一个从数据行生成的
字典
。我目前有一些方法可以解决这个问题,但我做得太多了,没有使用.ToDictionary()扩展方法

有人能告诉我如何成功地完成这项工作吗

以下是我失败的尝试:

var dataDictionary = dataTable.Select(acn + "=" + accountNumber).ToDictionary(key => key.Table.Columns);
这将返回一个
KeyValuePair
,但我需要一个
字典


再次提前感谢

您需要指定所需的键,可能是表中的
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]);

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

我知道这是旧版本,但对于后来出现的版本,正确的LINQ表达式只是对driis的代码稍加修改:

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

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

@jjoelson的答案产生了一本
字典
。如果您想要一本
词典
,您当然可以:

var dictionary = row.Table.Columns
    .Cast<DataColumn>()
    .ToDictionary(col => col.ColumnName, col => row.Field<object>(col.ColumnName));
var dictionary=row.Table.Columns
.Cast()
.ToDictionary(col=>col.ColumnName,col=>row.Field(col.ColumnName));
但一个稍微不那么复杂的版本是:

var dictionary row.Table.Columns
    .Cast<DataColumn>()
    .ToDictionary(col => col.ColumnName, col => row[col]);
var字典行.Table.Columns
.Cast()
.ToDictionary(col=>col.ColumnName,col=>row[col]);

您忘了提到您想要的密钥和值?没有这些,你的问题就没有意义了。我将发布一个使用一般术语的答案。谢谢你的回答-我想我可以做到这一点。我的键需要是列名,我的值需要是datarow中该列的值。嗯-您选择了多行还是您的
Select
只匹配一行?我匹配了一行。抱歉-我所拥有的是丑陋的-我这个实例的datatable只有一行,这就是我创建字典的依据。我需要的是类似于
字典{{“Acn”,“70707”},{“Name”,“John Smith”}
的东西。上面的代码还可以,但“没有编译器编写”。请务必使用@jjoelson的答案。