Как использовать метод расширения .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()