Contoh praktis di mana Tuple dapat digunakan di .Net 4.0?
97
Saya telah melihat Tuple diperkenalkan di .Net 4 tetapi saya tidak dapat membayangkan di mana ia dapat digunakan. Kami selalu dapat membuat kelas atau Struct Kustom.
Mungkin ini tempat yang baik untuk mencatat bahwa topik ini sudah sangat tua. Lihat apa yang terjadi di C # 7 !
maf-soft
Jawaban:
83
Itulah intinya - lebih mudah untuk tidak membuat kelas atau struct kustom setiap saat. Ini adalah peningkatan seperti Actionatau Func... Anda dapat membuat tipe ini sendiri, tetapi nyaman bahwa mereka ada dalam kerangka kerja.
Mungkin perlu ditunjukkan dari MSDN : "Semua anggota statis publik jenis ini aman untuk thread. Semua anggota instance tidak dijamin aman untuk thread. "
Matt Borja
Nah, mungkin desainer bahasa seharusnya membuatnya lebih mudah untuk membuat jenis kustom dengan cepat, lalu? Jadi kita bisa tetap menggunakan sintaks yang sama alih-alih memperkenalkan yang lain?
Thomas Eyde
@ThomasEyde itulah yang telah mereka lakukan selama 15 tahun terakhir. Begitulah ekspresi anggota bertubuh ditambahkan, dan sekarang nilai tupel. Kelas rekor gaya nyaris kembali dipotong pada bulan Agustus (9 bulan sebelum komentar ini) untuk versi C # 7, dan mungkin keluar di C # 8. Juga mencatat bahwa nilai tupel menawarkan nilai kesetaraan di mana kelas plain-tua tidak . Memperkenalkan semua ini pada tahun 2002 membutuhkan
pengetahuan sebelumnya
apa yang Anda maksud dengan convenient not to make a custom class. Apakah yang Anda maksud membuat instance kelas kustom menggunakan =new..()?
Alex
75
Dengan tupel, Anda dapat dengan mudah mengimplementasikan kamus dua dimensi (atau n-dimensi dalam hal ini). Misalnya, Anda dapat menggunakan kamus semacam itu untuk mengimplementasikan pemetaan pertukaran mata uang:
Saya lebih suka menggunakan Enum untuk singkatan negara. Apakah itu mungkin?
Zack
1
Tentu, itu harus bekerja tanpa masalah karena enum adalah tipe nilai.
MarioVW
@MarioVW Itu juga bisa dilakukan dengan menggunakan array multi-dimensi. Bagaimana tuple membuat perbedaan?
Alex
26
Ada artikel bagus di majalah MSDN yang berbicara tentang sakit perut dan pertimbangan desain yang digunakan untuk menambahkan Tuple ke BCL. Memilih antara tipe nilai dan tipe referensi sangatlah menarik.
Seperti yang dijelaskan dalam artikel tersebut, kekuatan pendorong di belakang Tuple adalah begitu banyak kelompok di dalam Microsoft yang memanfaatkannya, tim F # di depan. Meskipun tidak disebutkan, menurut saya kata kunci "dinamis" baru di C # (dan VB.NET) ada hubungannya dengan itu juga, tupel sangat umum dalam bahasa dinamis.
Hal ini tidak terlalu unggul dari membuat poco Anda sendiri, setidaknya Anda dapat memberi nama yang lebih baik kepada anggota.
UPDATE: karena revisi besar dalam C # versi 7, sekarang mendapatkan lebih banyak cinta sintaks. Pengumuman awal di posting blog ini .
Berikut adalah contoh kecil - misalnya Anda memiliki metode yang perlu mencari nama pengguna dan alamat email pengguna, dengan memberikan ID pengguna. Anda selalu dapat membuat kelas khusus yang berisi data tersebut, atau menggunakan parameter ref / out untuk data tersebut, atau Anda dapat mengembalikan Tuple dan memiliki tanda tangan metode yang bagus tanpa harus membuat POCO baru.
Ini adalah contoh yang bagus, namun tidak membenarkan penggunaan Tuple.
Amitabh
7
Sebuah tupel cocok di sini karena Anda mengembalikan nilai yang berbeda; tetapi tupel lebih bersinar saat Anda mengembalikan beberapa nilai dari tipe berbeda .
Mark Rushakoff
21
Contoh bagus lainnya adalah int.TryParse, karena Anda dapat menghilangkan parameter keluaran dan sebagai gantinya menggunakan Tuple. Jadi Anda bisa memiliki Tuple<bool, T> TryParse<T>(string input)dan alih-alih harus menggunakan parameter keluaran, Anda mendapatkan kedua nilai kembali dalam tupel.
Tejs
3
sebenarnya, itulah yang terjadi ketika Anda memanggil metode TryParse dari F #.
classGrid{publicstaticint[,]Cells={{08,02,22,// whole grid omittedpublicstaticIEnumerable<Tuple<int,int,int,int>>ToList(){// code converts grid to enumeration every possible set of 4 per rules// code omitted}}
Sekarang saya bisa menyelesaikan seluruh masalah dengan:
Sintaks tupel C # sangat besar, jadi tupel sulit untuk dideklarasikan. Dan itu tidak memiliki pencocokan pola, jadi mereka juga menyakitkan untuk digunakan.
Namun terkadang, Anda hanya menginginkan pengelompokan ad-hoc objek tanpa membuat kelas untuk itu. Misalnya, saya ingin menggabungkan daftar, tetapi saya menginginkan dua nilai, bukan satu:
// sum and sum of squares at the same timevar x =Enumerable.Range(1,100).Aggregate((acc, x)=>Tuple.Create(acc.Item1+ x, acc.Item2+ x * x));
Alih-alih menggabungkan sekumpulan nilai menjadi satu hasil, mari memperluas satu hasil menjadi sekumpulan nilai. Cara termudah untuk menulis fungsi ini adalah:
fmengubah beberapa status menjadi tupel. Kami mengembalikan nilai pertama dari tupel dan mengatur status baru kami ke nilai kedua. Ini memungkinkan kami untuk mempertahankan status selama penghitungan.
Anda menggunakannya seperti:
// return 0, 2, 3, 6, 8var evens =Unfold(0, state => state <10?Tuple.Create(state, state +2):null).ToList();// returns 0, 1, 1, 2, 3, 5, 8, 13, 21, 34var fibs =Unfold(Tuple.Create(0,1), state =>Tuple.Create(state.Item1,Tuple.Create(state.Item2, state.Item1+ state.Item2))).Take(10).ToList();
evenscukup mudah, tetapi fibssedikit lebih pintar. Ini statesebenarnya adalah tupel yang masing-masing memegang fib (n-2) dan fib (n-1).
+1 Tuple.Create adalah singkatan praktis untuknew Tuple<Guid,string,...>
AaronLS
@Juliet What the use of State keyword
irfandar
7
Saya tidak suka penyalahgunaannya, karena mereka menghasilkan kode yang tidak menjelaskan dirinya sendiri, tetapi mereka mengagumkan untuk mengimplementasikan kunci gabungan on-the-fly, karena mereka mengimplementasikan IStructuralEquatable dan IStructuralComparable (untuk digunakan baik untuk pencarian maupun pemesanan tujuan).
Dan mereka menggabungkan semua kode hash item mereka, secara internal; misalnya, inilah GetHashCode Tuple (diambil dari ILSpy):
Tupel sangat bagus untuk melakukan beberapa operasi IO asinkron pada satu waktu dan mengembalikan semua nilai secara bersamaan. Berikut adalah contoh melakukannya dengan dan tanpa Tuple. Tuple sebenarnya dapat membuat kode Anda lebih jelas!
Jika Anda menggunakan fungsi anonim dengan tipe tersirat , maka Anda tidak membuat kode kurang jelas dengan menggunakan Tuple. Retuning Tuple dari metode? Gunakan dengan hemat ketika kejelasan kode adalah kuncinya, menurut pendapat saya. Saya tahu pemrograman fungsional di C # sulit untuk ditolak, tetapi kita harus mempertimbangkan semua programmer C # yang "berorientasi objek".
Tuple banyak digunakan dalam bahasa fungsional yang dapat melakukan lebih banyak hal dengannya, sekarang F # adalah bahasa .net 'resmi' Anda mungkin ingin beroperasi dengannya dari C # dan meneruskannya di antara kode yang ditulis dalam dua bahasa.
Tuple juga dibangun dalam tipe untuk beberapa bahasa skrip populer seperti Python dan Ruby (yang juga memiliki implementasi .Net untuk interop ... IronPython / Ruby).
MutantNinjaCodeMonkey
5
Saya cenderung menghindari Tupleuntuk sebagian besar skenario karena itu merusak keterbacaan. Namun, Tupleberguna saat Anda perlu mengelompokkan data yang tidak terkait.
Misalnya, Anda memiliki daftar mobil dan kota tempat pembeliannya:
Tupleberguna dalam situasi kritis Pointatau SomeVectormungkin berguna saat melakukan operasi grafis. Ini menyoroti dua nilai yang sangat terkait satu sama lain. Saya sering melihat properti bernama StartTime dan EndTime ketika membaca kode, tetapi bahkan lebih baik daripada tanggal dan durasi, Tuple memaksa Anda untuk mempertimbangkan kedua nilai setiap kali Anda beroperasi di area logika bisnis Anda ini. Atau mengembalikan "hei, data telah berubah (bool), inilah data (jenis lain)" dalam proses berat alih-alih melalui pengikatan intensif.
Léon Pelletier
3
Anda harus sangat berhati-hati dalam menggunakan Tupledan mungkin berpikir dua kali sebelum melakukan ini. Dari pengalaman saya sebelumnya, saya menemukan bahwa menggunakan Tuplemembuat kode sangat sulit untuk dibaca dan didukung di masa depan. Beberapa waktu yang lalu, saya harus memperbaiki beberapa kode di mana tupel digunakan hampir di mana-mana. Alih-alih memikirkan model objek yang tepat, mereka hanya menggunakan tupel. Itu mimpi buruk ... terkadang aku ingin membunuh orang yang menulis kode ...
Tidak ingin mengatakan bahwa Anda tidak boleh menggunakan Tupledan itu jahat atau sesuatu dan saya seratus persen yakin ada beberapa tugas di mana Tuplekandidat terbaik untuk digunakan, tetapi mungkin Anda harus berpikir lagi, apakah Anda BENAR-BENAR membutuhkannya ?
Penggunaan terbaik untuk Tuple yang saya temukan adalah ketika perlu mengembalikan lebih dari 1 jenis objek dari suatu metode, Anda tahu apa jenis dan nomor objek itu, dan ini bukan daftar yang panjang.
Alternatif sederhana lainnya akan menggunakan parameter 'keluar'
privatestringMyMethod(outobject)
atau membuat Kamus
Dictionary<objectType1, objectType2>
Namun, menggunakan Tuple akan menghemat pembuatan objek 'keluar' atau harus mencari entri dalam kamus;
Baru saja menemukan solusi dari salah satu masalah saya di Tuple. Ini seperti mendeklarasikan kelas dalam lingkup suatu metode, tetapi dengan deklarasi malas dari nama bidangnya. Anda beroperasi dengan koleksi tupel, contoh tunggalnya, dan kemudian membuat koleksi tipe anonim dengan nama bidang yang diperlukan, berdasarkan tupel Anda. Ini menghindari Anda dari membuat kelas baru untuk tujuan ini.
Tugasnya adalah menulis respons JSON dari LINQ tanpa kelas tambahan apa pun:
//I select some roles from my ORM my with subrequest and save results to Tuple listvar rolesWithUsers =(from role in roles
selectnewTuple<string,int,int>(
role.RoleName,
role.RoleId,
usersInRoles.Where(ur => ur.RoleId== role.RoleId).Count()));//Then I add some new element required element to this collectionvar tempResult = rolesWithUsers.ToList();
tempResult.Add(newTuple<string,int,int>("Empty",-1,
emptyRoleUsers.Count()));//And create a new anonimous class collection, based on my Tuple list
tempResult.Select(item =>new{GroupName= item.Item1,GroupId= item.Item2,Count= item.Item3});//And return it in JSONreturnnewJavaScriptSerializer().Serialize(rolesWithUsers);
Karena kita bisa melakukan ini dengan mendeklarasikan Class baru untuk grup saya, tetapi ide untuk membuat koleksi anonim tanpa mendeklarasikan class baru.
Dalam kasus saya, saya harus menggunakan Tuple ketika saya menemukan bahwa kita tidak dapat menggunakan parameter dalam metode asynchronous. Bacalah di sini . Saya juga membutuhkan tipe pengembalian yang berbeda. Jadi saya menggunakan Tuple sebagai gantinya sebagai tipe kembalian saya dan menandai metode tersebut sebagai async.
Contoh kode di bawah ini.
......// calling code.var userDetails =awaitGetUserDetails(userId);Console.WriteLine("Username : {0}", userDetails.Item1);Console.WriteLine("User Region Id : {0}", userDetails.Item2);......privateasyncTuple<string,int>GetUserDetails(int userId){returnnewTuple<string,int>("Amogh",105);// Note that I can also use the existing helper method (Tuple.Create).}
Baca lebih lanjut tentang Tuple di sini . Semoga ini membantu.
Saya berasumsi Anda tidak ingin mengembalikan tipe atau Array anonim (atau konten dinamis)
ozzy432836
0
Mengubah bentuk objek saat Anda perlu mengirimnya melintasi kabel atau meneruskan ke lapisan aplikasi yang berbeda dan beberapa objek digabungkan menjadi satu:
Contoh:
var customerDetails =newTuple<Customer,List<Address>>(mainCustomer,newList<Address>{mainCustomerAddress}).ToCustomerDetails();
Parameter keluar sangat bagus ketika hanya ada beberapa nilai yang perlu dikembalikan, tetapi ketika Anda mulai menemukan 4, 5, 6, atau lebih nilai yang perlu dikembalikan, itu bisa menjadi sulit. Pilihan lain untuk mengembalikan beberapa nilai adalah membuat dan mengembalikan kelas / struktur yang ditentukan pengguna atau menggunakan Tuple untuk mengemas semua nilai yang perlu dikembalikan oleh metode.
Opsi pertama, menggunakan kelas / struktur untuk mengembalikan nilai, sangatlah mudah. Buat saja tipe (dalam contoh ini adalah struktur) seperti ini:
Opsi kedua, menggunakan Tuple, adalah solusi yang lebih elegan daripada menggunakan objek yang ditentukan pengguna. Tuple dapat dibuat untuk menampung sejumlah nilai dari berbagai jenis. Selain itu, data yang Anda simpan di Tuple tidak dapat diubah; setelah Anda menambahkan data ke Tuple melalui konstruktor atau metode Buat statis, data tersebut tidak dapat diubah. Tuple dapat menerima hingga dan termasuk delapan nilai terpisah. Jika Anda perlu mengembalikan lebih dari delapan nilai, Anda perlu menggunakan kelas Tuple khusus: Kelas Tuple Saat membuat Tupel dengan lebih dari delapan nilai, Anda tidak dapat menggunakan metode Buat statis — Anda harus menggunakan konstruktor kelas. Beginilah cara Anda membuat Tuple dari 10 nilai integer:
var values =newTuple<int,int,int,int,int,int,int,Tuple<int,int,int>>(1,2,3,4,5,6,7,newTuple<int,int,int>(8,9,10));
Tentu saja, Anda dapat terus menambahkan lebih banyak Tupel ke akhir setiap Tupel yang disematkan, membuat Tupel ukuran apa pun yang Anda butuhkan.
Hanya untuk pembuatan prototipe - Tupel tidak ada artinya. Ini nyaman untuk menggunakannya tetapi ini hanya jalan pintas! Untuk prototipe - bagus. Pastikan untuk menghapus kode ini nanti.
Mudah untuk menulis, sulit untuk dibaca. Itu tidak memiliki keunggulan yang terlihat atas kelas, kelas dalam, kelas anonim dll.
Baiklah saya mencoba 3 cara untuk memecahkan masalah yang sama di C # 7 dan saya telah menemukan kasus penggunaan untuk Tuple.
Bekerja dengan data dinamis dalam proyek web terkadang bisa menyebalkan saat memetakan, dll.
Saya suka cara Tuple secara otomatis dipetakan ke item1, item2, itemN yang tampaknya lebih kuat bagi saya daripada menggunakan indeks array di mana Anda mungkin terjebak pada item di luar indeks atau menggunakan jenis anonim di mana Anda mungkin salah mengeja nama properti.
Rasanya seperti DTO telah dibuat secara gratis hanya dengan menggunakan Tuple dan saya dapat mengakses semua properti menggunakan itemN yang terasa lebih seperti mengetik statis tanpa harus membuat DTO terpisah untuk tujuan itu.
Jawaban:
Itulah intinya - lebih mudah untuk tidak membuat kelas atau struct kustom setiap saat. Ini adalah peningkatan seperti
Action
atauFunc
... Anda dapat membuat tipe ini sendiri, tetapi nyaman bahwa mereka ada dalam kerangka kerja.sumber
convenient not to make a custom class
. Apakah yang Anda maksud membuat instance kelas kustom menggunakan=new..()
?Dengan tupel, Anda dapat dengan mudah mengimplementasikan kamus dua dimensi (atau n-dimensi dalam hal ini). Misalnya, Anda dapat menggunakan kamus semacam itu untuk mengimplementasikan pemetaan pertukaran mata uang:
sumber
Ada artikel bagus di majalah MSDN yang berbicara tentang sakit perut dan pertimbangan desain yang digunakan untuk menambahkan Tuple ke BCL. Memilih antara tipe nilai dan tipe referensi sangatlah menarik.
Seperti yang dijelaskan dalam artikel tersebut, kekuatan pendorong di belakang Tuple adalah begitu banyak kelompok di dalam Microsoft yang memanfaatkannya, tim F # di depan. Meskipun tidak disebutkan, menurut saya kata kunci "dinamis" baru di C # (dan VB.NET) ada hubungannya dengan itu juga, tupel sangat umum dalam bahasa dinamis.
Hal ini tidak terlalu unggul dari membuat poco Anda sendiri, setidaknya Anda dapat memberi nama yang lebih baik kepada anggota.
UPDATE: karena revisi besar dalam C # versi 7, sekarang mendapatkan lebih banyak cinta sintaks. Pengumuman awal di posting blog ini .
sumber
Berikut adalah contoh kecil - misalnya Anda memiliki metode yang perlu mencari nama pengguna dan alamat email pengguna, dengan memberikan ID pengguna. Anda selalu dapat membuat kelas khusus yang berisi data tersebut, atau menggunakan parameter ref / out untuk data tersebut, atau Anda dapat mengembalikan Tuple dan memiliki tanda tangan metode yang bagus tanpa harus membuat POCO baru.
sumber
Tuple<bool, T> TryParse<T>(string input)
dan alih-alih harus menggunakan parameter keluaran, Anda mendapatkan kedua nilai kembali dalam tupel.Saya menggunakan tupel untuk memecahkan Masalah 11 Proyek Euler :
Sekarang saya bisa menyelesaikan seluruh masalah dengan:
Saya bisa saja menggunakan tipe khusus untuk ini, tetapi akan terlihat persis seperti Tuple .
sumber
Sintaks tupel C # sangat besar, jadi tupel sulit untuk dideklarasikan. Dan itu tidak memiliki pencocokan pola, jadi mereka juga menyakitkan untuk digunakan.
Namun terkadang, Anda hanya menginginkan pengelompokan ad-hoc objek tanpa membuat kelas untuk itu. Misalnya, saya ingin menggabungkan daftar, tetapi saya menginginkan dua nilai, bukan satu:
Alih-alih menggabungkan sekumpulan nilai menjadi satu hasil, mari memperluas satu hasil menjadi sekumpulan nilai. Cara termudah untuk menulis fungsi ini adalah:
f
mengubah beberapa status menjadi tupel. Kami mengembalikan nilai pertama dari tupel dan mengatur status baru kami ke nilai kedua. Ini memungkinkan kami untuk mempertahankan status selama penghitungan.Anda menggunakannya seperti:
evens
cukup mudah, tetapifibs
sedikit lebih pintar. Inistate
sebenarnya adalah tupel yang masing-masing memegang fib (n-2) dan fib (n-1).sumber
new Tuple<Guid,string,...>
Saya tidak suka penyalahgunaannya, karena mereka menghasilkan kode yang tidak menjelaskan dirinya sendiri, tetapi mereka mengagumkan untuk mengimplementasikan kunci gabungan on-the-fly, karena mereka mengimplementasikan IStructuralEquatable dan IStructuralComparable (untuk digunakan baik untuk pencarian maupun pemesanan tujuan).
Dan mereka menggabungkan semua kode hash item mereka, secara internal; misalnya, inilah GetHashCode Tuple (diambil dari ILSpy):
sumber
Tupel sangat bagus untuk melakukan beberapa operasi IO asinkron pada satu waktu dan mengembalikan semua nilai secara bersamaan. Berikut adalah contoh melakukannya dengan dan tanpa Tuple. Tuple sebenarnya dapat membuat kode Anda lebih jelas!
Tanpa (bersarang buruk!):
Dengan Tuple
Jika Anda menggunakan fungsi anonim dengan tipe tersirat , maka Anda tidak membuat kode kurang jelas dengan menggunakan Tuple. Retuning Tuple dari metode? Gunakan dengan hemat ketika kejelasan kode adalah kuncinya, menurut pendapat saya. Saya tahu pemrograman fungsional di C # sulit untuk ditolak, tetapi kita harus mempertimbangkan semua programmer C # yang "berorientasi objek".
sumber
Tuple banyak digunakan dalam bahasa fungsional yang dapat melakukan lebih banyak hal dengannya, sekarang F # adalah bahasa .net 'resmi' Anda mungkin ingin beroperasi dengannya dari C # dan meneruskannya di antara kode yang ditulis dalam dua bahasa.
sumber
Saya cenderung menghindari
Tuple
untuk sebagian besar skenario karena itu merusak keterbacaan. Namun,Tuple
berguna saat Anda perlu mengelompokkan data yang tidak terkait.Misalnya, Anda memiliki daftar mobil dan kota tempat pembeliannya:
Anda ingin menggabungkan hitungan untuk setiap mobil per kota:
Untuk melakukan ini, Anda membuat file
Dictionary
. Anda punya beberapa pilihan:Dictionary<string, Dictionary<string, int>>
.Dictionary<CarAndCity, int>
.Dictionary<Tuple<string, string>, int>
.Keterbacaan hilang dengan opsi pertama. Ini akan meminta Anda untuk menulis lebih banyak kode.
Opsi kedua berfungsi dan ringkas, tetapi mobil dan kota tidak benar-benar terkait dan mungkin tidak tergabung dalam satu kelas.
Opsi ketiga ringkas dan bersih. Ini penggunaan yang baik
Tuple
.sumber
Beberapa contoh di luar kepala saya:
Misalnya Anda tidak ingin menyertakan System.Drawing dalam aplikasi web hanya untuk menggunakan Point / PointF dan Size / SizeF.
sumber
Tuple
berguna dalam situasi kritisPoint
atauSomeVector
mungkin berguna saat melakukan operasi grafis. Ini menyoroti dua nilai yang sangat terkait satu sama lain. Saya sering melihat properti bernama StartTime dan EndTime ketika membaca kode, tetapi bahkan lebih baik daripada tanggal dan durasi, Tuple memaksa Anda untuk mempertimbangkan kedua nilai setiap kali Anda beroperasi di area logika bisnis Anda ini. Atau mengembalikan "hei, data telah berubah (bool), inilah data (jenis lain)" dalam proses berat alih-alih melalui pengikatan intensif.Anda harus sangat berhati-hati dalam menggunakan
Tuple
dan mungkin berpikir dua kali sebelum melakukan ini. Dari pengalaman saya sebelumnya, saya menemukan bahwa menggunakanTuple
membuat kode sangat sulit untuk dibaca dan didukung di masa depan. Beberapa waktu yang lalu, saya harus memperbaiki beberapa kode di mana tupel digunakan hampir di mana-mana. Alih-alih memikirkan model objek yang tepat, mereka hanya menggunakan tupel. Itu mimpi buruk ... terkadang aku ingin membunuh orang yang menulis kode ...Tidak ingin mengatakan bahwa Anda tidak boleh menggunakan
Tuple
dan itu jahat atau sesuatu dan saya seratus persen yakin ada beberapa tugas di manaTuple
kandidat terbaik untuk digunakan, tetapi mungkin Anda harus berpikir lagi, apakah Anda BENAR-BENAR membutuhkannya ?sumber
Penggunaan terbaik untuk Tuple yang saya temukan adalah ketika perlu mengembalikan lebih dari 1 jenis objek dari suatu metode, Anda tahu apa jenis dan nomor objek itu, dan ini bukan daftar yang panjang.
Alternatif sederhana lainnya akan menggunakan parameter 'keluar'
atau membuat Kamus
Namun, menggunakan Tuple akan menghemat pembuatan objek 'keluar' atau harus mencari entri dalam kamus;
sumber
Baru saja menemukan solusi dari salah satu masalah saya di Tuple. Ini seperti mendeklarasikan kelas dalam lingkup suatu metode, tetapi dengan deklarasi malas dari nama bidangnya. Anda beroperasi dengan koleksi tupel, contoh tunggalnya, dan kemudian membuat koleksi tipe anonim dengan nama bidang yang diperlukan, berdasarkan tupel Anda. Ini menghindari Anda dari membuat kelas baru untuk tujuan ini.
Tugasnya adalah menulis respons JSON dari LINQ tanpa kelas tambahan apa pun:
Karena kita bisa melakukan ini dengan mendeklarasikan Class baru untuk grup saya, tetapi ide untuk membuat koleksi anonim tanpa mendeklarasikan class baru.
sumber
Dalam kasus saya, saya harus menggunakan Tuple ketika saya menemukan bahwa kita tidak dapat menggunakan parameter dalam metode asynchronous. Bacalah di sini . Saya juga membutuhkan tipe pengembalian yang berbeda. Jadi saya menggunakan Tuple sebagai gantinya sebagai tipe kembalian saya dan menandai metode tersebut sebagai async.
Contoh kode di bawah ini.
Baca lebih lanjut tentang Tuple di sini . Semoga ini membantu.
sumber
Mengubah bentuk objek saat Anda perlu mengirimnya melintasi kabel atau meneruskan ke lapisan aplikasi yang berbeda dan beberapa objek digabungkan menjadi satu:
Contoh:
ExtensionMethod:
sumber
Parameter keluar sangat bagus ketika hanya ada beberapa nilai yang perlu dikembalikan, tetapi ketika Anda mulai menemukan 4, 5, 6, atau lebih nilai yang perlu dikembalikan, itu bisa menjadi sulit. Pilihan lain untuk mengembalikan beberapa nilai adalah membuat dan mengembalikan kelas / struktur yang ditentukan pengguna atau menggunakan Tuple untuk mengemas semua nilai yang perlu dikembalikan oleh metode.
Opsi pertama, menggunakan kelas / struktur untuk mengembalikan nilai, sangatlah mudah. Buat saja tipe (dalam contoh ini adalah struktur) seperti ini:
Opsi kedua, menggunakan Tuple, adalah solusi yang lebih elegan daripada menggunakan objek yang ditentukan pengguna. Tuple dapat dibuat untuk menampung sejumlah nilai dari berbagai jenis. Selain itu, data yang Anda simpan di Tuple tidak dapat diubah; setelah Anda menambahkan data ke Tuple melalui konstruktor atau metode Buat statis, data tersebut tidak dapat diubah. Tuple dapat menerima hingga dan termasuk delapan nilai terpisah. Jika Anda perlu mengembalikan lebih dari delapan nilai, Anda perlu menggunakan kelas Tuple khusus: Kelas Tuple Saat membuat Tupel dengan lebih dari delapan nilai, Anda tidak dapat menggunakan metode Buat statis — Anda harus menggunakan konstruktor kelas. Beginilah cara Anda membuat Tuple dari 10 nilai integer:
Tentu saja, Anda dapat terus menambahkan lebih banyak Tupel ke akhir setiap Tupel yang disematkan, membuat Tupel ukuran apa pun yang Anda butuhkan.
sumber
Hanya untuk pembuatan prototipe - Tupel tidak ada artinya. Ini nyaman untuk menggunakannya tetapi ini hanya jalan pintas! Untuk prototipe - bagus. Pastikan untuk menghapus kode ini nanti.
Mudah untuk menulis, sulit untuk dibaca. Itu tidak memiliki keunggulan yang terlihat atas kelas, kelas dalam, kelas anonim dll.
sumber
Baiklah saya mencoba 3 cara untuk memecahkan masalah yang sama di C # 7 dan saya telah menemukan kasus penggunaan untuk Tuple.
Bekerja dengan data dinamis dalam proyek web terkadang bisa menyebalkan saat memetakan, dll.
Saya suka cara Tuple secara otomatis dipetakan ke item1, item2, itemN yang tampaknya lebih kuat bagi saya daripada menggunakan indeks array di mana Anda mungkin terjebak pada item di luar indeks atau menggunakan jenis anonim di mana Anda mungkin salah mengeja nama properti.
Rasanya seperti DTO telah dibuat secara gratis hanya dengan menggunakan Tuple dan saya dapat mengakses semua properti menggunakan itemN yang terasa lebih seperti mengetik statis tanpa harus membuat DTO terpisah untuk tujuan itu.
sumber