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

时间:2011-01-25 20:18:53

标签: c# linq

我需要一个从DataRow生成的Dictionary<string,object>。我目前有一些工作,但我做得太多而且没有使用.ToDictionary()扩展方法。

有人可以告诉我如何成功完成这项工作吗?

这是我失败的尝试:

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

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

提前再次感谢!

4 个答案:

答案 0 :(得分:27)

我知道这是旧的,但对于那些后来出现的正确的LINQ表达式是对driis代码的略微修改:

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

答案 1 :(得分: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]);

免责声明,上面的内容是在没有编译器的情况下编写的,可能需要稍微调整一下。

答案 2 :(得分:2)

@jjoelson的回答产生Dictionary<string, string>。如果你想要Dictionary<string, object>,你当然可以这样做:

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]);

答案 3 :(得分:-1)

我喜欢LINQ

AdminComponent
相关问题