2011-01-25 5 views
14

Мне нужен Dictionary<string,object>, который производится из DataRow. В настоящее время у меня есть что-то для этой работы, но я делаю слишком много и не использую метод расширения .ToDictionary().Как использовать .ToDictionary() метод расширения на DataRow

Может кто-нибудь, пожалуйста, просветит меня о том, как это сделать успешно?

Вот моя неудачная попытка:

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

Это возвращает KeyValuePair<DataColumnCollection, DataRow>, но опять же, я снова нужен Dictionary<string,object>

Спасибо заранее!

+1

Вы забыли упомянуть, что вы хотите, как ключ и значение? Без этого ваш вопрос не имеет смысла. Я отправлю ответ, используя общие термины. – driis

+0

Спасибо за ваш ответ - я думаю, что смогу сделать эту работу. мой ключ должен быть именем столбца, и мое значение должно быть значением для этого столбца в datarow. – BueKoW

+0

Хм - вы выбираете несколько строк или должны ли 'Select' соответствовать только одному? – driis

ответ

8

Вы должны specifiy ключ, который вы хотите, которые могли бы стать 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]); 

Отказ от ответственности, выше была написана без компилятора под рукой, возможно, потребуется немного настройки.

+0

Вышеприведенный код в порядке, но был «написан без компилятора». Обязательно используйте ответ @ jjoelson. –

25

Я знаю, что это старый, но для тех, которые приходят позже правильное выражение LINQ является небольшой модификацией кода driis'S:

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

Мне нравится LINQ

dataTable.Rows.Cast<DataRow>().Select(e=>e.Table.Columns.Cast<DataColumn>().ToDictionary(col => col.ColumnName, col => e[col.ColumnName])).ToList() 
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]); 
Смежные вопросы