c# - hacer - diccionario de datos youtube
Transformar una tabla de datos en el diccionario C# (6)
Creo que esto te ayudará:
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));
Quiero saber cómo transformar una tabla de datos en un diccionario. Hice algo como esto.
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));
}
Pero me sale:
System.Data.EnumerableRowCollection no contiene una definición para ''ToDictionary'' y la mejor sobrecarga del método de extensión ''System.Linq.Parallel.Enumerable.ToDictionary (System.Linq.ParallelQuery, System.Func, System.Collections.Generic.IEqualityComrparer)'' tiene algunos argumentos inválidos
¿Cómo puedo resolver esto?
Gracias
El método genérico ToDictionary
tiene 3 parámetros. Dejaste uno apagado, así que no sabe qué hacer. Si desea especificar todos los parámetros, sería <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));
}
Por supuesto, si los deja fuera, el compilador puede inferir los tipos, por lo que no obtiene el error.
Encontré la solución pero no sé por qué. Edité mi pregunta completando el código solo para aclarar lo que estaba haciendo y cambié a esto
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;
}
Prefiero este método:
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();
}
La razón por la que se debe a que este código también puede tratar con booleanos u otros tipos de datos llamando al método ToString.
Tenga en cuenta que esto devuelve una lista de diccionarios, puede modificarla a un diccionario de diccionarios si tiene una clave para cada fila.
iterar sobre una columna bool puede verse así:
var list = GetDataTableDictionaryList(dt);
foreach (var row in list)
{
if (row["Selected"].Equals("true", StringComparison.OrdinalIgnoreCase))
{
// do something
}
}
ToDictionary está esperando que IEnumberable<T>
sea el primer tipo ... le dijiste que era una cadena que está equivocada, es IEnumerable<DataRow>
Se está confundiendo al especificar los tipos ... prueba esto ...
internal Dictionary<string,object> GetDict(DataTable dt)
{
return dt.AsEnumerable()
.ToDictionary(row => row.Field<string>(0),
row => row.Field<object>(1));
}
Todas las respuestas previas no me ayudaron, así que hice esto:
myList = dt.AsEnumerable()
.ToDictionary<DataRow, string, string>(row => row[0].ToString(),
row => row[1].ToString());
y funcionó muy bien!