Tengo pocos métodos que devuelven diferentes listas genéricas.
¿Existe en .net algún método estático de clase o lo que sea para convertir cualquier lista en una tabla de datos? Lo único que puedo imaginar es usar Reflection para hacer esto.
SI tengo esto:
List<Whatever> whatever = new List<Whatever>();
(El siguiente código no funciona, por supuesto, pero me gustaría tener la posibilidad de:
DataTable dt = (DataTable) whatever;
Respuestas:
Aquí hay una buena actualización de 2013 usando FastMember de NuGet:
Esto utiliza la API de metaprogramación de FastMember para obtener el máximo rendimiento. Si desea restringirlo a miembros particulares (o hacer cumplir el orden), también puede hacerlo:
Editor de Dis / reclamante: FastMember es un proyecto de Marc Gravell. ¡Es oro y moscas!
Sí, esto es casi exactamente lo contrario de este ; la reflexión sería suficiente, o si necesita más rápido,
HyperDescriptor
en 2.0, o tal vezExpression
en 3.5. En realidad,HyperDescriptor
debería ser más que adecuado.Por ejemplo:
Ahora con una línea puede hacer esto muchas veces más rápido que la reflexión (habilitando
HyperDescriptor
el tipo de objetoT
).editar re consulta de rendimiento; Aquí hay una plataforma de prueba con resultados:
Sospecho que el cuello de botella ha cambiado del acceso de los miembros al
DataTable
rendimiento ... Dudo que mejore mucho en eso ...código:
fuente
Tuve que modificar el código de muestra de Marc Gravell para manejar tipos anulables y valores nulos. He incluido una versión de trabajo a continuación. Gracias Marc
fuente
public static DataTable ToDataTable<TKey, T>(this IEnumerable<IGrouping<TKey, T>> data)
Luego, agregue una columna adicional antes del bucle foreach:table.Columns.Add("Key", Nullable.GetUnderlyingType(typeof(TKey)) ?? typeof(TKey));
Y luego agregue un bucle alrededor del bucle de datos donde itera los grupos: foreach (IGrouping <TKey, T> grupo en datos) {foreach (elemento T en grupo. Artículos) {Vea este GIST para más detalles: gist.github.com/rickdailey/8679306ToDataTable
método. SiT
implementa una interfaz,typeof(T)
puede devolver el tipo de interfaz en lugar de la clase real del objeto, lo que da como resultado un vacíoDataTable
. Reemplazarlodata.First().GetType()
debería solucionarlo.Un pequeño cambio en la respuesta de Marc para que funcione con tipos de valores como
List<string>
la tabla de datos:fuente
Esta es una mezcla simple de las soluciones. Funciona con tipos anulables.
fuente
Vale la pena visitar este enlace en MSDN: Cómo: Implementar CopyToDataTable <T> Donde el tipo genérico T no es una fila de datos
Esto agrega un método de extensión que le permite hacer esto:
fuente
Otro enfoque es el anterior:
fuente
fuente
La respuesta de Marc Gravell pero en VB.NET
fuente
prueba esto
fuente
fuente
He escrito una pequeña biblioteca para realizar esta tarea. Utiliza la reflexión solo por primera vez para traducir un tipo de objeto a una tabla de datos. Emite un método que hará todo el trabajo traduciendo un tipo de objeto.
Es muy rápido. Puedes encontrarlo aquí: ModelShredder en GoogleCode
fuente
También tuve que encontrar una solución alternativa, ya que ninguna de las opciones enumeradas aquí funcionó en mi caso. Estaba usando un IEnumerable que devolvió un IEnumerable y las propiedades no se pudieron enumerar. Esto hizo el truco:
fuente
fuente
Me doy cuenta de que esto ha estado cerrado por un tiempo; sin embargo, tenía una solución a este problema específico pero necesitaba un pequeño giro: las columnas y la tabla de datos debían estar predefinidas / ya instanciadas. Luego necesitaba simplemente insertar los tipos en la tabla de datos.
Aquí hay un ejemplo de lo que hice:
fuente
Una respuesta de 2019 si está utilizando .NET Core: use la biblioteca Nuget ToDataTable . Ventajas:
Descargo de responsabilidad : soy el autor de ToDataTable
Rendimiento : amplío algunas pruebas de Benchmark .Net y las incluí en el repositorio ToDataTable . Los resultados fueron los siguientes:
Crear una tabla de datos de 100,000 filas :
El método FastMember sugerido en la respuesta de Marc parecía funcionar peor que la respuesta de Mary que usaba la reflexión, pero hice otro método usando un FastMember
TypeAccessor
y funcionó mucho mejor. Sin embargo, el paquete ToDataTable superó al lote.fuente
Si está utilizando VB.NET, esta clase hace el trabajo.
fuente
Si tiene propiedades en su clase, esta línea de código está bien.
pero si tiene todos los campos públicos, use esto:
la respuesta original es de arriba, acabo de editar para usar campos en lugar de propiedades
y para usarlo haga esto
fuente
Para convertir una lista genérica a una tabla de datos, puede usar el DataTableGenerator
Esta biblioteca le permite convertir su lista en una tabla de datos con funciones múltiples como
fuente
fuente
Para convertir una lista genérica en DataTable
usando Newtonsoft.Json;
fuente
Esta es la aplicación de consola simple para convertir List a Datatable.
fuente
Se probó el método para que acepte campos con null.
fuente
fuente
Creo que es más conveniente y fácil de usar.
fuente
Lista / datos = nueva Lista (); var dataDT = Newtonsoft.Json.JsonConvert.DeserializeObject (Newtonsoft.Json.JsonConvert.SerializeObject (datos));
fuente
La respuesta más simple podría ser esta:
[ https://stackoverflow.com/a/60776314/10235747font>[1]
fuente
Si desea utilizar la reflexión y establecer el orden de las columnas / incluir solo algunas columnas / Excluir algunas columnas, intente esto:
fuente