2011-01-25 8 views
14

Necesito un Dictionary<string,object> que se produce a partir de un DataRow. Actualmente tengo algo para esto funcionando, pero estoy haciendo demasiado y no estoy utilizando el método de extensión .ToDictionary().Cómo usar el método de extensión .ToDictionary() en DataRow

¿Puede alguien por favor aclararme sobre cómo lograr esto con éxito?

Aquí está mi intento fallido:

var dataDictionary = dataTable.Select(acn + "=" + accountNumber).ToDictionary(key => key.Table.Columns); 

Esto devuelve un KeyValuePair<DataColumnCollection, DataRow>, pero de nuevo, necesito un nuevo Dictionary<string,object>

Gracias de antemano!

+1

Se le olvidó mencionar lo que quieres como clave y el valor? Tu pregunta realmente no tiene sentido sin eso. Publicaré una respuesta usando términos generales. – driis

+0

Gracias por su respuesta, creo que puedo hacer que funcione. mi clave debe ser el nombre de la columna y mi valor debe ser el valor para esa columna en el datarow. – BueKoW

+0

Hmm - ¿está seleccionando varias filas o su 'Seleccionar 'solo debe coincidir con una sola? – driis

Respuesta

8

Necesitas specifiy la clave que desea, lo que podría ser la columna de la acn en la tabla:

.ToDictionary(row => (string)row["acn"]); 

ToDictionary toma un segundo delegado si desea ejecutar una transformación de los valores en el diccionario devuelto.

Editar

Voy a dejar la respuesta original, ya que explica el caso general. Quieres tomar una sola fila; luego use sus columnas como claves y los valores de la columna como, bueno, valores. Así es como haces eso.

DataRow row = dataTable.Select(acn + "=" + accountNumber).Single(); // You might want SingleOrDefault 
var dataDictionary = row.Table.Columns.ToDictionary(col => col.Name, col => row[col.Name]); 

exención de responsabilidad, lo anterior fue escrito sin un compilador que nos ocupa, puede ser que necesite un poco de ajustar.

+0

El código anterior está bien, pero fue "escrito sin compilador". Asegúrese de usar la respuesta de @ jjoelson en su lugar. –

25

Sé que esto es viejo, pero para aquellos que vienen a lo largo de más adelante la expresión LINQ correcta es una ligera modificación del código de driis:

var dictionary = row.Table.Columns 
    .Cast<DataColumn>() 
    .ToDictionary(col => col.ColumnName, col => row.Field<string>(col.ColumnName)); 
-1

me gusta LINQ

dataTable.Rows.Cast<DataRow>().Select(e=>e.Table.Columns.Cast<DataColumn>().ToDictionary(col => col.ColumnName, col => e[col.ColumnName])).ToList() 
2

@ respuesta de jjoelson produce un Dictionary<string, string>. Si quieres un Dictionary<string, object>, usted podría, por supuesto, hacer:

var dictionary = row.Table.Columns 
    .Cast<DataColumn>() 
    .ToDictionary(col => col.ColumnName, col => row.Field<object>(col.ColumnName)); 

Pero una versión ligeramente menos complicado es:

var dictionary row.Table.Columns 
    .Cast<DataColumn>() 
    .ToDictionary(col => col.ColumnName, col => row[col]); 
Cuestiones relacionadas