Mam kilka metod, które zwracają różne listy ogólne.
Istnieje w .net jakakolwiek metoda statyczna klasy lub cokolwiek, aby przekonwertować dowolną listę na dane? Jedyne, co mogę sobie wyobrazić, to użyć Reflection, aby to zrobić.
JEŚLI mam to:
List<Whatever> whatever = new List<Whatever>();
(Ten następny kod oczywiście nie działa, ale chciałbym mieć możliwość:
DataTable dt = (DataTable) whatever;
Odpowiedzi:
Oto ładna aktualizacja 2013 za pomocą FastMember od NuGet:
Używa meta-programowania API FastMember dla maksymalnej wydajności. Jeśli chcesz ograniczyć go do określonych członków (lub egzekwować zamówienie), możesz to również zrobić:
Redaktor Dis / pretendent: FastMember to projekt Marc Gravell. Złoto i pełne muchy!
Tak, jest to dokładne przeciwieństwo tego ; wystarczy refleksja - lub jeśli potrzebujesz szybciej,
HyperDescriptor
w wersji 2.0 lubExpression
3.5. W rzeczywistościHyperDescriptor
powinno być więcej niż wystarczające.Na przykład:
Teraz za pomocą jednej linii możesz zrobić to wiele razy szybciej niż odbicie (poprzez włączenie
HyperDescriptor
typu obiektuT
).edytuj zapytanie dotyczące wydajności; oto platforma testowa z wynikami:
Podejrzewam, że wąskie gardło zmieniło się z dostępu członków na
DataTable
wydajność ... Wątpię, czy znacznie poprawisz to ...kod:
źródło
Musiałem zmodyfikować przykładowy kod Marc Gravell, aby obsługiwał typy zerowalne i wartości zerowe. Poniżej zamieściłem działającą wersję. Dzięki Marc.
źródło
public static DataTable ToDataTable<TKey, T>(this IEnumerable<IGrouping<TKey, T>> data)
Następnie dodaj dodatkową kolumnę przed pętlą foreach:table.Columns.Add("Key", Nullable.GetUnderlyingType(typeof(TKey)) ?? typeof(TKey));
A następnie dodaj pętlę wokół pętli danych, w której iterujesz grupy: foreach (IGrouping <TKey, T> grupa w danych) {foreach (element T w grupie. Elementy) {Aby uzyskać szczegółowe informacje, zobacz GIST: gist.github.com/rickdailey/8679306ToDataTable
metodzie jest jeden podstępny błąd . JeśliT
implementuje interfejs,typeof(T)
może zwrócić typ interfejsu zamiast faktycznej klasy obiektu, co spowoduje, że będzie pustyDataTable
. Zastąpienie godata.First().GetType()
powinno to naprawić.Mała zmiana w odpowiedzi Marca, aby działała z typami wartości, takimi jak
List<string>
tabela danych:źródło
To prosta kombinacja rozwiązań. Działa z typami dopuszczającymi wartości zerowe.
źródło
Ten link w witrynie MSDN jest warty odwiedzenia: Jak: Implementować CopyToDataTable <T> Gdzie ogólny typ T nie jest DataRow
Dodaje to metodę rozszerzenia, która pozwala to zrobić:
źródło
Innym podejściem jest powyższe:
źródło
źródło
Odpowiedź Marca Gravella, ale w VB.NET
źródło
Spróbuj tego
źródło
źródło
Sam napisałem małą bibliotekę, aby wykonać to zadanie. Wykorzystuje odbicie tylko po raz pierwszy, gdy typ obiektu ma zostać przetłumaczony na dane. Emituje metodę, która wykona całą pracę tłumacząc typ obiektu.
Płonie szybko. Można go znaleźć tutaj: ModelShredder na GoogleCode
źródło
Musiałem też wymyślić alternatywne rozwiązanie, ponieważ żadna z wymienionych tutaj opcji nie działała w moim przypadku. Używałem IEnumerable, który zwrócił IEnumerable, a właściwości nie można wyliczyć. To załatwiło sprawę:
źródło
źródło
Zdaję sobie sprawę, że zostało to na jakiś czas zamknięte; Miałem jednak rozwiązanie tego konkretnego problemu, ale potrzebowałem lekkiego skrętu: kolumny i tabela danych musiały być predefiniowane / już utworzone. Następnie musiałem po prostu wstawić typy do tabeli danych.
Oto przykład tego, co zrobiłem:
źródło
Odpowiedź na 2019 rok, jeśli korzystasz z .NET Core - skorzystaj z biblioteki ToDataTable firmy Nuget . Zalety:
Oświadczenie - Jestem autorem ToDataTable
Wydajność - rozszerzyłem niektóre testy Benchmark .Net i umieściłem je w repozytorium ToDataTable . Wyniki były następujące:
Tworzenie 100 000 wierszy danych :
Metoda FastMember sugerowana w odpowiedzi Marca wydawała się działać gorzej niż odpowiedź Mary, która używała refleksji, ale rzuciłem inną metodę za pomocą FastMember
TypeAccessor
i działała znacznie lepiej. Niemniej jednak pakiet ToDataTable wypadł znacznie lepiej.źródło
Jeśli używasz VB.NET, ta klasa wykonuje to zadanie.
źródło
jeśli masz właściwości w swojej klasie, ten wiersz kodu jest OK !!
ale jeśli masz wszystkie pola publiczne, użyj tego:
oryginalna odpowiedź jest z góry, właśnie edytowałem, aby użyć pól zamiast właściwości
i aby z niego skorzystać, zrób to
źródło
Aby przekonwertować ogólną listę na tabelę danych, możesz użyć DataTableGenerator
Ta biblioteka pozwala przekonwertować listę na tabelę danych zawierającą wiele funkcji
źródło
źródło
Aby przekonwertować listę ogólną na tabelę danych
using Newtonsoft.Json;
źródło
Jest to prosta aplikacja konsoli do konwersji listy na dane.
źródło
Se probó el método para que acepte campos con null.
źródło
źródło
Myślę, że jest wygodniejszy i łatwiejszy w użyciu.
źródło
List / data = new List (); var dataDT = Newtonsoft.Json.JsonConvert.DeserializeObject (Newtonsoft.Json.JsonConvert.SerializeObject (dane));
źródło
Najprostsza odpowiedź może być następująca:
[ https://stackoverflow.com/a/60776314/10235747][1]
źródło
Jeśli chcesz użyć odbicia i ustawić kolejność kolumn / uwzględnij tylko niektóre kolumny / Wyklucz niektóre kolumny, spróbuj:
źródło