Convertir Liste générique/Énumérable à DataTable?
J'ai quelques méthodes qui renvoie Génériques différents Listes.
Existe dans .net toute la classe méthode statique ou que ce soit pour convertir n'importe quelle liste dans un datatable? La seule chose que je peux imaginer est utiliser la Réflexion pour ce faire.
SI j'ai ceci:
List<Whatever> whatever = new List<Whatever>();
(Ce code ne fonctionne pas, bien sûr, mais je voudrais avoir la possibilité de:
DataTable dt = (DataTable) whatever;
- Bien sûr, une bonne question serait: "pourquoi?" - lorsque List<T>, est dans de nombreux cas, un meilleur outil que DataTable ;-p Chacune de leur propre, je suppose...
- Je pense que celui-ci peut être un doublon de cette question: stackoverflow.com/questions/523153/... Il a même une quasi identiques réponse. 🙂
- Mes "pourquoi?" est une Liste<T> la manipulation (de la Traversée de colonnes & les lignes). Je suis en train de faire un tableau croisé dynamique à partir d'une Liste<T>, et aux propriétés via la réflexion c'est une douleur. Je fais de mal?
- il ya un certain nombre d'outils pour supprimer le reflet de la douleur là - FastMember saute à l'esprit. Il se pourrait aussi que d'un DataTable est utile pour des scénarios spécifiques - tout dépend du contexte. Peut-être le plus gros problème est que les gens à l'aide de DataTable pour tous de stockage de données simplement parce qu'il existe, sans prendre le temps d'examiner les options et de leur scénario.
- si vous êtes intéressés, j'ai mis à jour FastMember d'avoir un soutien direct pour voir la mise à jour de réponse
- Si vous venez de quoi pivot pourquoi ne pas utiliser le linqLib linqlib.codeplex.com elle met en œuvre presque tout ce que vous pouvez penser pour IEnumerable.
- Cross post pour cette réponse qui m'a aidé. stackoverflow.com/questions/3839022/listt-to-dataview
InformationsquelleAutor Josema | 2009-02-19
Vous devez vous connecter pour publier un commentaire.
Voici une belle 2013 mise à jour à l'aide de FastMember de NuGet:
Il utilise le FastMember la méta-programmation de l'API pour une performance maximale. Si vous souhaitez restreindre à certains membres (ou de faire respecter l'ordre), alors vous pouvez le faire aussi:
De l'éditeur Dis/déclarant: FastMember est un Marc Gravel projet. Son or et complet sur les flys!
Oui, c'est à peu près l'exact opposé de cette un; 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 ligne que vous pouvez faire ce beaucoup de beaucoup de fois plus vite que la réflexion (en permettant
HyperDescriptor
de l'objet de typeT
).edit re requête de performance; voici un banc d'essai avec des résultats:
Je soupçonne que le goulot d'étranglement a changé à partir de états-accès à
DataTable
performance... je doute que vous allez améliorer bien sur que...code:
static
modificateur; à noter qu'un non-statique de la classe peut encore avoirstatic
méthodes; c'est l'inverse qui est bloqué: unstatic
classe ne peut pas avoir les méthodes d'instanceFastMember
est utilisé pour la carteIEnumerable<T>
àDataTable
droit? Avez-vous quelque chose dans le sens inverse?DataTable
àIEnumerable<T>
?List<string>(){"a","b","c"}
T
a unpublic
propriété qui estWriteOnly
(qui a unset
mais pasget
)J'ai dû modifier Marc Gravel exemple de code pour gérer les types nullables et les valeurs null. J'ai inclus une version de travail ci-dessous. Merci Marc.
public static DataTable ToDataTable<TKey, T>(this IEnumerable<IGrouping<TKey, T>> data)
Ensuite, ajouter une colonne supplémentaire avant la boucle foreach:table.Columns.Add("Key", Nullable.GetUnderlyingType(typeof(TKey)) ?? typeof(TKey));
puis ajouter une boucle autour de la data boucle où vous parcourez les groupes: foreach (IGrouping<TKey, T> groupe data) { foreach (T élément dans le groupe.Articles) { Voir ce GIST pour plus de détails: gist.github.com/rickdailey/8679306ToDataTable
méthode. SiT
implémente une interfacetypeof(T)
peut retourner le type d'interface plutôt que la classe réelle de l'objet, ce qui entraîne un videDataTable
. Remplacer avecdata.First().GetType()
devrait résoudre le problème.C'est un simple mélange de ces solutions.
Il travail avec des types Nullables.
Un petit changement à La réponse de Marc à le faire fonctionner avec les types de valeur comme
List<string>
de tableau de données:Ce lien sur MSDN mérite une visite: Comment: mettre en Œuvre CopyToDataTable<T> Lorsque le Type Générique T n'Est Pas un DataRow
Cela ajoute une méthode d'extension qui vous permet de le faire:
J'ai écrit une petite bibliothèque de moi-même pour accomplir cette tâche. Il utilise la réflexion que pour la première fois un type d'objet est à traduire à un datatable. Il émet une méthode qui va faire tout le travail de traduction d'un type d'objet.
Son ultra-rapide. Vous pouvez le trouver ici:
ModelShredder sur GoogleCode
Il est également possible par le biais de XmlSerialization.
L'idée est - sérialiser au format XML, puis méthode readXml de DataSet.
- Je utiliser ce code (à partir d'une réponse dans la, oublié où)
alors c'est aussi simple que:
Pas sûr de savoir comment il se dresse contre toutes les autres réponses de ce post, mais c'est aussi une possibilité.
Marc Gravel de la réponse, mais dans VB.NET
essayer cette
Une autre approche est la ci-dessus:
J'ai aussi dû trouver une autre solution, car aucune des options listées ici a fonctionné dans mon cas. J'ai été en utilisant un IEnumerable qui a renvoyé un IEnumerable et les propriétés ne pouvait pas être dénombrés. Cela a fait le tour:
Je me rends compte que cela a été fermé pendant un certain temps; cependant, j'ai eu une solution à ce problème spécifique, mais a besoin d'une légère torsion: les colonnes et les données de la table devait être prédéfinis /déjà instancié. Ensuite, j'ai besoin simplement de l'insérer les types dans le tableau de données.
Voici donc un exemple de ce que j'ai fait:
Si vous utilisez VB.NET puis cette classe fait le travail.
si vous avez des propriétés dans votre classe cette ligne de code est OK !!
mais si vous avez tous les champs, puis utiliser ceci:
l'original de la réponse est à partir de ci-dessus , j'ai juste modifié pour utiliser des champs plutôt que des propriétés
et de les utiliser pour ce faire
C'est la simple Application Console pour convertir la Liste de Datatable.
Se probó el método para qué acepte campos con null.
Je pense que c'est plus pratique et facile à utiliser.