Как использовать метод расширения .ToDictionary() для DataRow
Мне нужен Dictionary<string,object>
, который создается из DataRow. В настоящее время у меня есть что-то для этой работы, но я делаю слишком много и не использую метод расширения .ToDictionary().
Может кто-нибудь, пожалуйста, просветит меня, как это сделать успешно?
Вот моя неудачная попытка:
var dataDictionary = dataTable.Select(acn + "=" + accountNumber).ToDictionary(key => key.Table.Columns);
Это возвращает a KeyValuePair<DataColumnCollection, DataRow>
, но опять же мне нужен Dictionary<string,object>
Еще раз спасибо!
Ответы
Ответ 1
Вам нужно указать желаемый ключ, который может быть столбцом 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
Я знаю, что это старо, но для тех, кто приходит позже, правильное выражение LINQ представляет собой небольшую модификацию кода driis:
var dictionary = row.Table.Columns
.Cast<DataColumn>()
.ToDictionary(col => col.ColumnName, col => row.Field<string>(col.ColumnName));
Ответ 3
@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]);
Ответ 4
Мне нравится LINQ
dataTable.Rows.Cast<DataRow>().Select(e=>e.Table.Columns.Cast<DataColumn>().ToDictionary(col => col.ColumnName, col => e[col.ColumnName]) ).ToList()