Преобразование DataTable в словарь C#

Я хочу знать, как преобразовать 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));
}

а я:

6 ответов


универсальный метод 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));
}

конечно, если вы оставите их, компилятор может вывести типы, поэтому вы не получите ошибку.


все предыдущие ответы не помогли мне, поэтому я сделал это:

myList = dt.AsEnumerable()
.ToDictionary<DataRow, string, string>(row => row[0].ToString(),
                                       row => row[1].ToString()); 

и это сработало отлично!


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));
}

Я думаю, что это поможет вам:

            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));

Я нашел решение, но не знаю, почему. Я отредактировал свой вопрос, заполнив код только для того, чтобы прояснить, что я делал, и я изменил на это

    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;
    }

Я предпочитаю этот метод:

public static List<Dictionary<string, string>> GetDataTableDictionaryList(DataTable dt)
{
    return dt.AsEnumerable().Select(
        row => dt.Columns.Cast<DataColumn>().ToDictionary(
            column => column.ColumnName,
            column => row[column].ToString()
        )).ToList();
}

причина в том, что этот код также может иметь дело с логическими или другими типами данных, вызывая метод ToString.

уведомления возвращает список словарей, вы можете изменить его в словарь словарей, если у вас есть ключ для каждой строки.

итерация по столбцу bool может выглядеть так:

var list = GetDataTableDictionaryList(dt);

foreach (var row in list)
{
    if (row["Selected"].Equals("true", StringComparison.OrdinalIgnoreCase))
    {
        // do something
    }
}