Преобразование 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
}
}