Ich habe nur wenige Methoden, die unterschiedliche generische Listen zurückgeben.
Gibt es in .net eine statische Klassenmethode oder was auch immer, um eine Liste in eine Datentabelle umzuwandeln? Das einzige, was ich mir vorstellen kann, ist Reflection, um dies zu tun.
WENN ich das habe:
List<Whatever> whatever = new List<Whatever>();
(Dieser nächste Code funktioniert natürlich nicht, aber ich hätte gerne die Möglichkeit:
DataTable dt = (DataTable) whatever;
Antworten:
Hier ist ein schönes 2013-Update mit FastMember von NuGet:
Dies verwendet die Meta-Programmier-API von FastMember für maximale Leistung. Wenn Sie es auf bestimmte Mitglieder beschränken möchten (oder die Anordnung durchsetzen möchten), können Sie dies auch tun:
Dis / Claimer des Herausgebers : FastMember ist ein Marc Gravell-Projekt. Sein Gold und seine Fliegen!
Ja, das ist so ziemlich das genaue Gegenteil von diesem ; Reflexion würde ausreichen - oder wenn Sie schneller brauchen,
HyperDescriptor
in 2.0 oder vielleichtExpression
in 3.5. EigentlichHyperDescriptor
sollte mehr als ausreichend sein.Beispielsweise:
Mit einer Zeile können Sie dies jetzt um ein Vielfaches schneller als die Reflexion machen (indem Sie
HyperDescriptor
den Objekttyp aktivierenT
).Bearbeiten Sie die Leistungsabfrage. Hier ist ein Prüfstand mit Ergebnissen:
Ich vermute, dass sich der Engpass vom Mitgliederzugriff auf die
DataTable
Leistung verlagert hat ... Ich bezweifle, dass Sie dies erheblich verbessern werden ...Code:
quelle
Ich musste den Beispielcode von Marc Gravell ändern, um nullfähige Typen und null Werte zu verarbeiten. Ich habe unten eine Arbeitsversion eingefügt. Danke Marc.
quelle
public static DataTable ToDataTable<TKey, T>(this IEnumerable<IGrouping<TKey, T>> data)
dann eine zusätzliche Spalte vor der foreach-Schleife hinzu:table.Columns.Add("Key", Nullable.GetUnderlyingType(typeof(TKey)) ?? typeof(TKey));
Fügen Sie dann eine Schleife um die Datenschleife hinzu, in der Sie die Gruppen iterieren: foreach (IGrouping <TKey, T> Gruppe in Daten) {foreach (T-Element in Gruppe.Items) {Siehe diese GIST für vollständige Details: gist.github.com/rickdailey/8679306ToDataTable
Methode. WennT
eine Schnittstelle implementiert wird, wirdtypeof(T)
möglicherweise der Schnittstellentyp anstelle der tatsächlichen Klasse des Objekts zurückgegeben, was zu einem Leerzeichen führtDataTable
. Das Ersetzen durchdata.First().GetType()
sollte das Problem beheben.Eine kleine Änderung an Marc's Antwort , damit sie mit Werttypen wie
List<string>
der Datentabelle funktioniert :quelle
Dies ist eine einfache Mischung der Lösungen. Es funktioniert mit nullbaren Typen.
quelle
Dieser Link auf MSDN ist einen Besuch wert : Gewusst wie: Implementieren von CopyToDataTable <T> Wenn der generische Typ T keine DataRow ist
Dies fügt eine Erweiterungsmethode hinzu, mit der Sie Folgendes tun können:
quelle
Ein anderer Ansatz ist der oben genannte:
quelle
quelle
Marc Gravells Antwort aber in VB.NET
quelle
Versuche dies
quelle
quelle
Ich habe selbst eine kleine Bibliothek geschrieben, um diese Aufgabe zu erfüllen. Die Reflexion wird nur zum ersten Mal verwendet, wenn ein Objekttyp in eine Datentabelle übersetzt werden soll. Es gibt eine Methode aus, die die gesamte Arbeit zur Übersetzung eines Objekttyps erledigt.
Es ist blitzschnell. Sie finden es hier: ModelShredder auf GoogleCode
quelle
Ich musste auch eine alternative Lösung finden, da in meinem Fall keine der hier aufgeführten Optionen funktionierte. Ich habe eine IEnumerable verwendet, die eine IEnumerable zurückgegeben hat, und die Eigenschaften konnten nicht aufgelistet werden. Das hat den Trick gemacht:
quelle
quelle
Mir ist klar, dass dies für eine Weile geschlossen ist; Ich hatte jedoch eine Lösung für dieses spezielle Problem, brauchte aber eine leichte Wendung: Die Spalten und die Datentabelle mussten vordefiniert / bereits instanziiert sein. Dann musste ich einfach die Typen in die Datentabelle einfügen.
Hier ist ein Beispiel für das, was ich getan habe:
quelle
Eine Antwort für 2019, wenn Sie .NET Core verwenden - verwenden Sie die Nuget ToDataTable-Bibliothek . Vorteile:
Haftungsausschluss - Ich bin der Autor von ToDataTable
Leistung - Ich habe einige Benchmark .Net- Tests zusammengefasst und sie in das ToDataTable-Repo aufgenommen . Die Ergebnisse waren wie folgt:
Erstellen einer Datentabelle mit 100.000 Zeilen :
Die in Marc's Antwort vorgeschlagene FastMember-Methode schien schlechter zu funktionieren als Marys Antwort, die Reflexion verwendete, aber ich habe eine andere Methode mit einem FastMember gewürfelt
TypeAccessor
und sie lief viel besser. Trotzdem übertraf das ToDataTable- Paket das Los.quelle
Wenn Sie VB.NET verwenden, erledigt diese Klasse den Job.
quelle
Wenn Sie Eigenschaften in Ihrer Klasse haben, ist diese Codezeile in Ordnung !!
Wenn Sie jedoch alle öffentlichen Felder haben, verwenden Sie Folgendes:
Die ursprüngliche Antwort stammt von oben. Ich habe sie nur bearbeitet, um Felder anstelle von Eigenschaften zu verwenden
und um es zu benutzen, mach das
quelle
Um eine generische Liste in eine Datentabelle zu konvertieren, können Sie den DataTableGenerator verwenden
Mit dieser Bibliothek können Sie Ihre Liste in eine Datentabelle mit mehreren Funktionen wie konvertieren
quelle
quelle
So konvertieren Sie die generische Liste in DataTable
mit Newtonsoft.Json;
quelle
Dies ist die einfache Konsolenanwendung zum Konvertieren von List in Datatable.
quelle
Se probó el método para que acepte campos con null.
quelle
quelle
Ich denke, es ist bequemer und einfacher zu bedienen.
quelle
Liste / Daten = neue Liste (); var dataDT = Newtonsoft.Json.JsonConvert.DeserializeObject (Newtonsoft.Json.JsonConvert.SerializeObject (Daten));
quelle
Die einfachste Antwort könnte diese sein:
[ https://stackoverflow.com/a/60776314/10235747 weibl. [1 ]
quelle
Wenn Sie Reflektion verwenden und die Spaltenreihenfolge festlegen möchten / nur einige Spalten einschließen / einige Spalten ausschließen möchten, versuchen Sie Folgendes:
quelle