Saya punya beberapa metode yang mengembalikan Daftar Generik yang berbeda.
Ada di .net setiap metode statis kelas atau apa pun untuk mengubah daftar apa pun menjadi datatable? Satu-satunya hal yang dapat saya bayangkan adalah menggunakan Refleksi untuk melakukan ini.
JIKA saya punya ini:
List<Whatever> whatever = new List<Whatever>();
(Kode berikut ini tidak berfungsi tentu saja, tetapi saya ingin memiliki kemungkinan:
DataTable dt = (DataTable) whatever;
Jawaban:
Inilah pembaruan 2013 yang bagus menggunakan FastMember dari NuGet:
Ini menggunakan API meta-pemrograman FastMember untuk kinerja maksimum. Jika Anda ingin membatasi itu untuk anggota tertentu (atau menegakkan pesanan), maka Anda dapat melakukannya juga:
Editor's Dis / claimer: FastMember adalah proyek Marc Gravell. Emas dan lalat penuh!
Ya, ini persis kebalikan dari yang ini ; refleksi sudah cukup - atau jika Anda perlu lebih cepat,
HyperDescriptor
dalam 2.0, atau mungkinExpression
dalam 3,5. Sebenarnya,HyperDescriptor
harus lebih dari cukup.Sebagai contoh:
Sekarang dengan satu baris Anda dapat membuat ini berkali-kali lebih cepat daripada refleksi (dengan mengaktifkan
HyperDescriptor
untuk tipe objekT
).edit permintaan kinerja ulang; inilah rig uji dengan hasil:
Saya menduga bahwa bottleneck telah bergeser dari akses anggota ke
DataTable
kinerja ... Saya ragu Anda akan banyak memperbaiki hal itu ...kode:
sumber
Saya harus memodifikasi kode sampel Marc Gravell untuk menangani tipe nullable dan nilai null. Saya telah memasukkan versi yang berfungsi di bawah ini. Terima kasih, Marc.
sumber
public static DataTable ToDataTable<TKey, T>(this IEnumerable<IGrouping<TKey, T>> data)
Lalu, tambahkan kolom tambahan sebelum loop foreach:table.Columns.Add("Key", Nullable.GetUnderlyingType(typeof(TKey)) ?? typeof(TKey));
Dan kemudian tambahkan loop di sekitar loop data di mana Anda mengulangi grup: foreach (IGrouping <TKey, T> grup dalam data) {foreach (item T di group.Items) {Lihat GIST ini untuk detail lengkap: gist.github.com/rickdailey/8679306ToDataTable
metode ini . JikaT
mengimplementasikan antarmukatypeof(T)
dapat mengembalikan jenis antarmuka daripada kelas objek yang sebenarnya, menghasilkan kosongDataTable
. Menggantinya dengandata.First().GetType()
harus memperbaikinya.Perubahan kecil pada jawaban Marc untuk membuatnya berfungsi dengan tipe nilai seperti
List<string>
tabel data:sumber
Ini adalah campuran sederhana dari solusi. Ini bekerja dengan tipe Nullable.
sumber
Tautan ini pada MSDN patut dikunjungi: Cara: Menerapkan CopyToDataTable <T> Di mana Generic Type T Bukan DataRow
Ini menambahkan metode ekstensi yang memungkinkan Anda melakukan ini:
sumber
Pendekatan lain adalah di atas:
sumber
sumber
Jawaban Marc Gravell tetapi dalam VB.NET
sumber
coba ini
sumber
sumber
Saya sendiri sudah menulis perpustakaan kecil untuk menyelesaikan tugas ini. Ini menggunakan refleksi hanya untuk pertama kalinya jenis objek harus diterjemahkan ke data. Itu memancarkan metode yang akan melakukan semua pekerjaan menerjemahkan jenis objek.
Sangat cepat. Anda dapat menemukannya di sini: ModelShredder di GoogleCode
sumber
Saya juga harus datang dengan solusi alternatif, karena tidak ada opsi yang tercantum di sini yang berfungsi dalam kasus saya. Saya menggunakan IEnumerable yang mengembalikan IEnumerable dan properti tidak dapat disebutkan. Ini berhasil:
sumber
sumber
Saya menyadari bahwa ini telah ditutup untuk sementara waktu; Namun, saya punya solusi untuk masalah khusus ini tetapi membutuhkan sedikit sentuhan: kolom dan tabel data harus ditentukan sebelumnya / sudah dipakai. Kemudian saya perlu memasukkan tipe-tipe ke tabel data.
Jadi, inilah contoh dari apa yang saya lakukan:
sumber
Jawaban 2019 jika Anda menggunakan .NET Core - gunakan pustaka Nuget ToDataTable . Keuntungan:
Penafian - Saya penulis ToDataTable
Kinerja - Saya merentang beberapa tes Benchmark .Net dan memasukkannya ke dalam repo ToDataTable . Hasilnya adalah sebagai berikut:
Membuat 100.000 Baris Datatable :
Metode FastMember yang disarankan dalam jawaban Marc tampaknya berkinerja lebih buruk daripada jawaban Mary yang menggunakan refleksi, tetapi saya menggulirkan metode lain menggunakan FastMember
TypeAccessor
dan kinerjanya jauh lebih baik. Namun demikian paket ToDataTable mengungguli banyak.sumber
Jika Anda menggunakan VB.NET maka kelas ini melakukan pekerjaan.
sumber
jika Anda memiliki properti di kelas Anda, baris kode ini OK !!
tetapi jika Anda memiliki semua bidang publik maka gunakan ini:
jawaban asli dari atas, saya baru saja diedit untuk menggunakan bidang bukan properti
dan untuk menggunakannya lakukan ini
sumber
Untuk mengonversi daftar generik ke tabel data, Anda bisa menggunakan DataTableGenerator
Pustaka ini memungkinkan Anda mengubah daftar Anda menjadi tabel data dengan multi-fitur like
sumber
sumber
Untuk Mengubah daftar Generik menjadi DataTable
menggunakan Newtonsoft.Json;
sumber
Ini adalah Aplikasi Konsol sederhana untuk mengonversi Daftar ke Datatable.
sumber
Seolah Anda dapat memilih untuk menerima campo con null.
sumber
sumber
Saya pikir ini lebih nyaman dan mudah digunakan.
sumber
Daftar / data = Daftar baru (); var dataDT = Newtonsoft.Json.JsonConvert.DeserializeObject (Newtonsoft.Json.JsonConvert.SerializeObject (data));
sumber
Jawaban paling sederhana bisa yang ini:
[ https://stackoverflow.com/a/60776314/10235747[[1]
sumber
Jika Anda ingin menggunakan refleksi dan mengatur urutan kolom / hanya menyertakan beberapa kolom / Kecualikan beberapa kolom coba ini:
sumber