Подтвердить что ты не робот

Преобразование 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) имеет несколько недопустимых аргументов

Как я могу это решить?

Спасибо

4b9b3361

Ответ 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));