Saya suka tuple . Mereka memungkinkan Anda untuk dengan cepat mengelompokkan informasi yang relevan bersama tanpa harus menulis struct atau kelas untuk itu. Ini sangat berguna saat refactoring kode yang sangat lokal.
Menginisialisasi daftar mereka tampaknya agak berlebihan.
var tupleList = new List<Tuple<int, string>>
{
Tuple.Create( 1, "cow" ),
Tuple.Create( 5, "chickens" ),
Tuple.Create( 1, "airplane" )
};
Apakah tidak ada cara yang lebih baik? Saya ingin solusi di sepanjang baris penginisialisasi Kamus .
Dictionary<int, string> students = new Dictionary<int, string>()
{
{ 111, "bleh" },
{ 112, "bloeh" },
{ 113, "blah" }
};
Tidak bisakah kita menggunakan sintaksis yang sama?
Dictionary
tidak mengizinkan kunci duplikat.Jawaban:
c # 7.0 memungkinkan Anda melakukan ini:
Jika Anda tidak membutuhkan
List
, tetapi hanya sebuah array, Anda dapat melakukannya:Dan jika Anda tidak menyukai "Item1" dan "Item2", Anda dapat melakukannya:
atau untuk sebuah array:
yang memungkinkan Anda melakukannya:
tupleList[0].Index
dantupleList[0].Name
Kerangka 4.6.2 dan di bawah
Anda harus menginstal
System.ValueTuple
dari Package Manager Nuget.Kerangka 4.7 dan di atas
Itu dibangun ke dalam kerangka kerja. Jangan tidak menginstal
System.ValueTuple
. Bahkan, hapus dan hapus dari direktori bin.Catatan: Dalam kehidupan nyata, saya tidak akan bisa memilih antara sapi, ayam atau pesawat. Saya akan benar-benar terkoyak.
sumber
System.ValueTuple
mendukung core 2.0. Tapi, cobalah tanpa Nuget terlebih dahulu, karena paket yang tidak perlu dapat menyebabkan masalah. Jadi satu atau lain cara, ya. Gunakan c # v7 atau lebih besar jika memungkinkan.Iya! Ini mungkin .
Ini memungkinkan Anda melakukan hal berikut:
sumber
groceryList[0] == groceryList[1]
atau apakah perbandingan harus dilaksanakan?C # 6 menambahkan fitur baru hanya untuk ini: ekstensi Tambahkan metode. Ini selalu dimungkinkan untuk VB.net tetapi sekarang tersedia dalam C #.
Sekarang Anda tidak perlu menambahkan
Add()
metode ke kelas secara langsung, Anda dapat menerapkannya sebagai metode ekstensi. Saat memperluas jenis enumerable apa pun denganAdd()
metode, Anda akan dapat menggunakannya dalam ekspresi initializer koleksi. Jadi, Anda tidak harus menurunkan daftar lagi secara eksplisit ( seperti yang disebutkan dalam jawaban lain ), Anda dapat memperpanjangnya.Ini akan memungkinkan Anda untuk melakukan ini pada kelas apa pun yang mengimplementasikan
IList<>
:Tentu saja Anda tidak dibatasi untuk memperluas koleksi tupel, itu bisa untuk koleksi jenis tertentu yang Anda inginkan untuk sintaks khusus.
C # 7 akan menambahkan dukungan untuk tuple yang dibangun ke dalam bahasa, meskipun mereka akan dari jenis yang berbeda (
System.ValueTuple
sebagai gantinya). Jadi, sebaiknya tambahkan kelebihan untuk tuple nilai sehingga Anda memiliki opsi untuk menggunakannya juga. Sayangnya, tidak ada konversi implisit yang ditentukan di antara keduanya.Dengan cara ini, inisialisasi daftar akan terlihat lebih bagus.
Tetapi alih-alih melalui semua masalah ini, mungkin lebih baik beralih ke menggunakan
ValueTuple
secara eksklusif.sumber
TupleList<int, string>.
lebih mudah dibaca daripadaList<Tuple<int, string>>
.using TupleList = System.Collections.Generic.List<System.Tuple<int, string>>;
Anda dapat melakukan ini dengan memanggil konstruktor setiap kali dengan sedikit lebih baik
sumber
Tuple.Create
sebagai gantinya dan Anda dapat menyimpulkan argumen tipePertanyaan lama, tapi inilah yang biasanya saya lakukan untuk membuat hal-hal sedikit lebih mudah dibaca:
sumber
Super Duper Tua Saya tahu tetapi saya akan menambahkan bagian saya tentang menggunakan Linq dan kelanjutan lambdas tentang metode dengan menggunakan C # 7. Saya mencoba menggunakan tuple bernama sebagai pengganti untuk DTO dan proyeksi anonim ketika digunakan kembali di kelas. Ya untuk mengejek dan menguji Anda masih perlu kelas tetapi melakukan hal-hal inline dan berkeliling di kelas bagus untuk memiliki opsi IMHO ini lebih baru. Anda dapat membuat instantiate dari
sumber
Mengapa suka tupel? Ini seperti jenis anonim: tidak ada nama. Tidak dapat memahami struktur data.
Saya suka kelas klasik
sumber
Satu teknik yang saya pikir sedikit lebih mudah dan itu belum disebutkan sebelumnya di sini:
Saya pikir itu sedikit lebih bersih daripada:
sumber
var
atau tidak. Saya pribadi lebih suka mengetik secara eksplisit (ketika tidak diduplikasi dalam mis. Konstruktor).sumber