I have few methods that returns different Generic Lists.
Exists in .net any class static method or whatever to convert any list into a datatable? The only thing that i can imagine is use Reflection to do this.
IF i have this:
List<Whatever> whatever = new List<Whatever>();
(This next code doesn't work of course, but i would like to have the possibility of:
DataTable dt = (DataTable) whatever;
Réponses:
Here's a nice 2013 update using FastMember from NuGet:
This uses the FastMember's meta-programming API for maximum performance. If you want to restrict it to particular members (or enforce the order), then you can do that too:
Editor's Dis/claimer: FastMember is a Marc Gravell project. Its gold and full-on flys!
Oui, c'est à peu près exactement le contraire de celui- ci; la réflexion suffirait - ou si vous avez besoin de plus rapide,
HyperDescriptor
en 2.0, ou peut-êtreExpression
en 3.5. En fait,HyperDescriptor
devrait être plus que suffisant.Par exemple:
Maintenant, avec une seule ligne, vous pouvez rendre cela beaucoup plus rapide que la réflexion (en activant
HyperDescriptor
pour le type d'objetT
).modifier re requête de performance; voici un banc d'essai avec des résultats:
Je soupçonne que le goulot d'étranglement est passé de l'accès des membres à la
DataTable
performance ... Je doute que vous amélioriez beaucoup cela ...code:
la source
J'ai dû modifier l'exemple de code de Marc Gravell pour gérer les types et les valeurs Nullables. J'ai inclus une version de travail ci-dessous. Merci Marc.
la source
public static DataTable ToDataTable<TKey, T>(this IEnumerable<IGrouping<TKey, T>> data)
Ensuite, ajoutez une colonne supplémentaire avant la boucle foreach:table.Columns.Add("Key", Nullable.GetUnderlyingType(typeof(TKey)) ?? typeof(TKey));
Et puis ajoutez une boucle autour de la boucle de données où vous itérez les groupes: foreach (IGrouping <TKey, T> groupe dans les données) {foreach (élément T dans group.Items) {Voir cet GIST pour plus de détails: gist.github.com/rickdailey/8679306ToDataTable
méthode. SiT
implémente une interfacetypeof(T)
peut renvoyer le type d'interface plutôt que la classe réelle de l'objet, résultant en un videDataTable
. Le remplacer pardata.First().GetType()
devrait le réparer.Un petit changement à la réponse de Marc pour le faire fonctionner avec des types de valeurs comme
List<string>
dans le tableau de données:la source
Il s'agit d'un simple mélange de solutions. Cela fonctionne avec les types Nullable.
la source
Ce lien sur MSDN vaut le détour: Comment: implémenter CopyToDataTable <T> où le type générique T n'est pas un DataRow
Cela ajoute une méthode d'extension qui vous permet de faire ceci:
la source
Une autre approche est la suivante:
la source
la source
Réponse de Marc Gravell mais en VB.NET
la source
essaye ça
la source
la source
J'ai écrit moi-même une petite bibliothèque pour accomplir cette tâche. Il utilise la réflexion uniquement pour la première fois qu'un type d'objet doit être traduit en table de données. Il émet une méthode qui fera tout le travail de traduction d'un type d'objet.
C'est extrêmement rapide. Vous pouvez le trouver ici: ModelShredder sur GoogleCode
la source
J'ai également dû trouver une solution alternative, car aucune des options énumérées ici ne fonctionnait dans mon cas. J'utilisais un IEnumerable qui renvoyait un IEnumerable et les propriétés ne pouvaient pas être énumérées. Cela a fait l'affaire:
la source
la source
Je me rends compte que cela a été fermé pendant un certain temps; cependant, j'avais une solution à ce problème spécifique mais j'avais besoin d'une légère torsion: les colonnes et le tableau de données devaient être prédéfinis / déjà instanciés. Ensuite, je devais simplement insérer les types dans le tableau de données.
Voici donc un exemple de ce que j'ai fait:
la source
Une réponse 2019 si vous utilisez .NET Core - utilisez la bibliothèque Nuget ToDataTable . Avantages:
Clause de non - responsabilité - je suis l'auteur de ToDataTable
Performance - J'ai étendu certains tests Benchmark .Net et les ai inclus dans le référentiel ToDataTable . Les résultats sont les suivants:
Création d'une table de données de 100 000 lignes :
La méthode FastMember suggérée dans la réponse de Marc semblait plus mauvaise que la réponse de Mary qui utilisait la réflexion, mais j'ai lancé une autre méthode en utilisant un FastMember
TypeAccessor
et elle fonctionnait beaucoup mieux. Néanmoins, le package ToDataTable a surperformé le lot.la source
Si vous utilisez VB.NET, cette classe fait le travail.
la source
si vous avez des propriétés dans votre classe, cette ligne de code est OK !!
mais si vous avez tous les champs publics, utilisez ceci:
la réponse d'origine est d'en haut, je viens de modifier pour utiliser des champs au lieu de propriétés
et pour l'utiliser, faites cela
la source
Pour convertir une liste générique en table de données, vous pouvez utiliser DataTableGenerator
Cette bibliothèque vous permet de convertir votre liste en un tableau de données avec des fonctionnalités multiples comme
la source
la source
Pour convertir une liste générique en DataTable
using Newtonsoft.Json;
la source
Il s'agit de l'application console simple pour convertir la liste en table de données.
la source
Se probó el método para that acepte campos con null.
la source
la source
Je pense que c'est plus pratique et facile à utiliser.
la source
List / data = new List (); var dataDT = Newtonsoft.Json.JsonConvert.DeserializeObject (Newtonsoft.Json.JsonConvert.SerializeObject (data));
la source
La réponse la plus simple pourrait être celle-ci:
[ https://stackoverflow.com/a/60776314/10235747[-021]
la source
Si vous souhaitez utiliser la réflexion et définir l'ordre des colonnes / inclure uniquement certaines colonnes / exclure certaines colonnes, essayez ceci:
la source