Преобразование DataTable в словарь С#
Я хочу знать, как преобразовать DataTable в словарь. Я сделал что-то вроде этого.
using System.Linq;
internal Dictionary<string,object> GetDict(DataTable dt)
{
return dt.AsEnumerable()
.ToDictionary<string, object>(row => row.Field<string>(0),
row => row.Field<object>(1));
}
Но я получаю:
System.Data.EnumerableRowCollection не содержит определения для "ToDictionary" и наилучшего метода перегрузки надстройки "System.Linq.Parallel.Enumerable.ToDictionary(System.Linq.ParallelQuery, System.Func, System.Collections.Generic. IEqualityComrparer) имеет несколько недопустимых аргументов
Как я могу это решить?
Спасибо
Ответы
Ответ 1
Общий метод ToDictionary
имеет 3 параметра. Вы оставили его, поэтому он не знает, что делать. Если вы хотите указать все параметры, это будет <DataRow, string, object>
.
internal Dictionary<string,object> GetDict(DataTable dt)
{
return dt.AsEnumerable()
.ToDictionary<DataRow, string, object>(row => row.Field<string>(0),
row => row.Field<object>(1));
}
Конечно, если вы их не оставите, компилятор сможет вывести типы, поэтому вы не получите ошибку.
Ответ 2
Все предыдущие ответы мне не помогли, поэтому я сделал это:
myList = dt.AsEnumerable()
.ToDictionary<DataRow, string, string>(row => row[0].ToString(),
row => row[1].ToString());
и он отлично поработает!
Ответ 3
ToDictionary ожидает, что IEnumberable<T>
будет первым типом... вы говорили, что это была строка, которая не соответствует ей IEnumerable<DataRow>
Это запутывается вами, указывая типы... попробуйте это...
internal Dictionary<string,object> GetDict(DataTable dt)
{
return dt.AsEnumerable()
.ToDictionary(row => row.Field<string>(0),
row => row.Field<object>(1));
}
Ответ 4
Я нашел решение, но не знаю почему. Я редактировал свой вопрос, заполняя код только для того, чтобы дать понять, что я делаю. Я изменил это на
internal Dictionary<string, object> GetDict(DataTable dt)
{
Dictionary<String, Object> dic = dt.AsEnumerable().ToDictionary(row => row.Field<String>(0), row => row.Field<Object>(1));
return dic;
}
Ответ 5
Я думаю, это поможет вам:
DataTable dt = new DataTable();
dt.Columns.Add("Column1");
dt.Columns.Add("Column2");
dt.Rows.Add(1, "first");
dt.Rows.Add(2, "second");
var dictionary = dt.Rows.OfType<DataRow>().ToDictionary(d => d.Field<string>(0), v => v.Field<object>(1));