Di C # 3.0 Anda dapat membuat kelas anonim dengan sintaks berikut
var o = new { Id = 1, Name = "Foo" };
Apakah ada cara untuk menambahkan kelas anonim ini ke daftar generik?
Contoh:
var o = new { Id = 1, Name = "Foo" };
var o1 = new { Id = 2, Name = "Bar" };
List<var> list = new List<var>();
list.Add(o);
list.Add(o1);
Contoh lain:
List<var> list = new List<var>();
while (....)
{
....
list.Add(new {Id = x, Name = y});
....
}
c#
.net
generics
anonymous-types
Dornpout
sumber
sumber
new[] { new{ Id = (int?)null, Name = "Foo" }, new { Id = (int?)1, Name = "Foo" }}
Jawaban:
Anda bisa melakukannya:
Ada banyak cara menguliti kucing ini, tetapi pada dasarnya mereka semua akan menggunakan jenis inferensi di suatu tempat - yang berarti Anda harus memanggil metode generik (mungkin sebagai metode ekstensi). Contoh lain mungkin:
Anda mendapatkan idenya :)
sumber
Inilah jawabannya.
sumber
string.Join
dan string interpolasi, jadi tidak perlu menggunakanforeach
danFormat
.Ada banyak cara untuk melakukan ini, tetapi beberapa respons di sini adalah membuat daftar yang mengandung elemen sampah, yang mengharuskan Anda untuk menghapus daftar.
Jika Anda mencari daftar kosong dari tipe generik, gunakan Pilih terhadap Daftar Tuples untuk membuat daftar kosong. Tidak ada elemen yang akan dipakai.
Berikut ini satu-liner untuk membuat daftar kosong:
Kemudian Anda dapat menambahkannya menggunakan tipe generik Anda:
Sebagai alternatif, Anda dapat melakukan sesuatu seperti di bawah ini untuk membuat daftar kosong (Tapi, saya lebih suka contoh pertama karena Anda dapat menggunakannya untuk koleksi Tuples yang terpopulasi juga):
sumber
Enumerable.Empty<object>().Select(o=>definition).ToList()
Tidak persis, tetapi Anda dapat mengatakan
List<object>
dan semuanya akan berhasil. Namun,list[0].Id
tidak akan berhasil.Ini akan bekerja saat runtime di C # 4.0 dengan memiliki
List<dynamic>
, yaitu Anda tidak akan mendapatkan IntelliSense.sumber
saya tebak
akan bekerja.
Anda mungkin juga mempertimbangkan untuk menulisnya seperti ini:
sumber
Saya biasanya menggunakan yang berikut ini; terutama karena Anda kemudian "mulai" dengan daftar yang kosong.
Akhir-akhir ini, saya malah menulis seperti ini:
Menggunakan metode pengulangan juga akan memungkinkan Anda untuk melakukan:
..yang memberi Anda daftar awal dengan item pertama sudah ditambahkan.
sumber
Anda dapat melakukan ini dalam kode Anda.
sumber
Di versi terbaru 4.0, bisa menggunakan dinamis seperti di bawah ini
sumber
Saya memeriksa IL pada beberapa jawaban. Kode ini secara efisien menyediakan Daftar kosong:
sumber
IEnumerable
, sedangkan versi saya kembaliList
, persis apa yang diminta OP.new object[] { }.Select(o => new { Id = default(int), Name = default(string) }).ToList()
Ini usahaku.
Saya datang dengan ini ketika saya menulis sesuatu yang mirip untuk membuat Daftar Anonim untuk jenis kustom.
sumber
Anda dapat membuat daftar dinamis.
"dynamic" diinisialisasi oleh nilai tambah pertama.
sumber
Alih-alih ini:
Anda bisa melakukan ini:
Namun, Anda akan mendapatkan kesalahan compiletime jika Anda mencoba melakukan sesuatu seperti ini di lingkup lain, meskipun itu berfungsi saat runtime:
Masalahnya adalah bahwa hanya anggota Object yang tersedia saat runtime, meskipun intellisense akan menampilkan properti id dan nama .
Dalam .net 4.0 solusinya adalah dengan menggunakan istead dinamis objek dinamis dalam kode di atas.
Solusi lain adalah menggunakan refleksi untuk mendapatkan properti
sumber
Berikut adalah metode lain untuk membuat Daftar jenis anonim yang memungkinkan Anda untuk memulai dengan daftar kosong, tetapi masih memiliki akses ke IntelliSense.
Jika Anda ingin menyimpan item pertama, cukup masukkan satu huruf dalam string.
sumber
sumber
Ini adalah pertanyaan lama, tapi saya pikir saya akan memasukkan jawaban C # 6 saya. Saya sering harus mengatur data uji yang mudah dimasukkan dalam kode sebagai daftar tupel. Dengan beberapa fungsi ekstensi, dimungkinkan untuk memiliki format yang bagus dan ringkas ini, tanpa mengulangi nama pada setiap entri.
Ini memberikan IEnumerable - jika Anda ingin daftar yang dapat Anda tambahkan kemudian tambahkan ToList ().
Keajaiban ini berasal dari ekstensi kustom Tambahkan metode untuk tuple, seperti yang dijelaskan di https://stackoverflow.com/a/27455822/4536527 .
}
Satu-satunya hal yang saya tidak suka adalah bahwa jenis dipisahkan dari nama-nama, tetapi jika Anda benar-benar tidak ingin membuat kelas baru maka pendekatan ini masih akan membiarkan Anda memiliki data yang dapat dibaca.
sumber
Saya sangat terkejut tidak ada yang menyarankan inisialisasi koleksi. Cara ini hanya dapat menambahkan objek ketika daftar dibuat maka namanya namun sepertinya cara terbaik untuk melakukannya. Tidak perlu membuat array lalu mengonversinya menjadi daftar.
Anda selalu dapat menggunakan
object
alih-alihdynamic
tetapi mencoba menjaganya dalam cara generik yang benar kemudiandynamic
lebih masuk akal.sumber
Anda dapat melakukannya dengan cara ini:
Sepertinya sedikit "hacky" bagi saya, tetapi berhasil - jika Anda benar-benar perlu memiliki daftar dan tidak bisa hanya menggunakan array anonim.
sumber
Untuk contoh kedua, di mana Anda harus menginisialisasi yang baru
List<T>
, satu ide adalah membuat daftar anonim, dan kemudian hapus.Atau sebagai metode ekstensi, seharusnya lebih mudah:
Atau mungkin lebih pendek,
sumber
Jika Anda menggunakan C # 7 atau lebih tinggi, Anda bisa menggunakan tipe tuple dan bukan tipe anonim.
sumber
Berasal dari jawaban ini , saya menemukan dua metode yang dapat melakukan tugas:
Anda dapat menggunakan metode seperti
Jawaban ini memiliki ide yang sama, tetapi saya tidak melihatnya sampai setelah saya membuat metode itu.
sumber
Coba dengan ini:
sumber
sumber