Sepertinya List<T>
dalam C # dapat melakukan segalanya array dapat melakukan dan banyak lagi, dan tampaknya juga sama efisiennya dalam memori dan kinerja sebagai array.
Jadi mengapa saya ingin menggunakan array?
Saya jelas tidak bertanya tentang kasus di mana API atau kendala eksternal lainnya (yaitu fungsi Utama) mengharuskan saya untuk menggunakan array ... Saya hanya bertanya tentang membuat struktur data baru dalam kode saya sendiri.
c#
data-types
JoelFan
sumber
sumber
List<T>
is also just as efficient in memory and performance as an array
- um. Dari mana Anda mendapatkan gagasan itu?var test = new string[5,5]
;)Jawaban:
Alasan yang sama saya tidak mengendarai truk ketika akan bekerja. Saya tidak menggunakan sesuatu yang saya tidak akan menggunakan fitur.
Pertama-tama array adalah konstruksi primitif sehingga array lebih cepat dan lebih efisien daripada Daftar <>, jadi argumen Anda tidak benar. Array juga tersedia di mana-mana dan dikenal oleh pengembang menggunakan berbagai bahasa dan platform.
Alasan paling penting saya menggunakan array daripada Daftar <> adalah untuk menyiratkan bahwa data adalah panjang tetap . Jika saya tidak akan menambah atau menghapus item apa pun dari pengumpulan data itu, saya ingin memastikan bahwa jenisnya mencerminkan hal itu.
Hal lain adalah katakanlah Anda menerapkan struktur data baru dan Anda telah membaca beberapa makalah tentang itu. Sekarang saat menerapkan algoritma tertentu, Anda tidak selalu bisa bergantung pada implementasi orang lain dari jenis yang bersifat umum. Ini berubah dari .NET ke Mono dan bahkan antara versi kerangka kerja yang berbeda.
Dan kadang-kadang lebih mudah untuk mem-porting sepotong kode yang menggunakan array daripada tipe kerangka bergantung.
sumber
List<T>
array diimplementasikan menggunakan array? Jika Anda tahu jumlah elemen sebelumnya (yang harus Anda ketahui, saat menggunakan array), Anda bisa menggunakan pengetahuan itu saat menginisialisasi daftar juga.Anda perlu array untuk mengelola koleksi struct yang bisa berubah , tentu saja, dan apa yang akan kami lakukan tanpa itu.
(perhatikan bahwa mungkin ada beberapa kasus di mana array struct yang dapat diubah diinginkan, tetapi biasanya perilaku yang berbeda dari struct yang bisa berubah dalam array versus koleksi lainnya adalah sumber kesalahan yang harus dihindari)
Lebih serius, Anda memerlukan sebuah array jika Anda ingin melewatkan elemen dengan referensi . yaitu
Itu bisa berguna untuk kode threadsafe bebas kunci.
Anda memerlukan array jika Anda ingin menginisialisasi koleksi ukuran tetap dengan cepat dan efisien dengan nilai default .
(perhatikan bahwa mungkin untuk mengimplementasikan konstruktor untuk Daftar yang melakukan hal yang sama, hanya saja c # tidak menawarkan fitur ini)
Anda memerlukan sebuah array jika Anda ingin menyalin bagian koleksi secara efisien
(sekali lagi, ini adalah sesuatu yang bisa diterapkan untuk Daftar juga, tetapi fitur ini tidak ada di c #)
sumber
Jarang , Anda akan memiliki skenario di mana Anda tahu bahwa Anda memerlukan sejumlah elemen. Dari perspektif desain, ini harus dihindari. Jika Anda memerlukan 3 hal, sifat bisnis berarti Anda akan sangat membutuhkan 4 di rilis berikutnya.
Namun, ketika skenario langka ini benar-benar terjadi, menggunakan array untuk memastikan bahwa invarian ukuran tetap berguna. Ini memberikan sinyal kepada programmer lain bahwa itu adalah ukuran tetap, dan membantu mencegah penyalahgunaan di mana seseorang menambah atau menghapus elemen - melanggar harapan di tempat lain dalam kode.
sumber
Pertanyaan Anda sebenarnya sudah dijawab sebelumnya .
Bukan itu. Dari pertanyaan yang saya tautkan:
Array dua kali lebih cepat dalam kasus-kasus penting tertentu. Saya yakin penggunaan memori juga berbeda secara non-sepele.
Karena premis utama pertanyaan Anda dikalahkan, saya menganggap ini menjawab pertanyaan Anda. Selain itu, terkadang array dipaksakan pada Anda oleh Win32 API, atau shader GPU Anda, atau pustaka non-DotNet lainnya.
Bahkan di dalam DotNet, beberapa metode mengkonsumsi dan / atau mengembalikan array (seperti
String.Split
). Yang berarti Anda sekarang harus memakan biaya panggilanToList
danToArray
sepanjang waktu, atau Anda harus menyesuaikan dan menggunakan array, mungkin melanjutkan siklus dengan menyebarkan ini kepada pengguna hilir kode Anda yang buruk .Lebih banyak pertanyaan dan jawaban tentang Stack Overflow pada topik ini:
List<T>
: Kapan menggunakan yang mana?List<>
?sumber
Selain alasan yang tercantum dalam jawaban lain, array literal membutuhkan lebih sedikit karakter untuk menyatakan:
Menggunakan array daripada
List
membuat kode sedikit lebih pendek dan hanya sedikit lebih mudah dibaca dalam kasus ketika (1) Anda harus melewatiIEnumerable<T>
literal apa pun , atau (2) di mana fungsi lain dariList
tidak masalah dan Anda perlu menggunakan beberapa daftar seperti harfiah.Saya telah melakukan ini sesekali dalam unit test.
sumber
foreach( var x in new []{ a, b, c ) ) DoStuff( x )
atau yangnew []{ a, b, c ).Select( ... )
lainnyaIni benar-benar dari perspektif OO.
Walaupun saya tidak dapat memikirkan alasan untuk melewatkan array, saya tentu dapat melihat situasi di mana representasi array internal ke kelas mungkin merupakan pilihan terbaik.
Walaupun ada opsi lain yang memberikan karakteristik serupa, tidak ada yang tampak seintuitif array untuk masalah yang berhubungan dengan pemrosesan permutasi, bersarang untuk loop, representasi matriks, bitmap dan algoritma interleaving data.
Ada sejumlah besar bidang ilmiah yang mengandalkan matematika matriks secara luas. (misalnya pemrosesan gambar, koreksi kesalahan data, pemrosesan sinyal digital, rim masalah matematika terapan). Sebagian besar algoritma di bidang tersebut ditulis dalam hal menggunakan array / matriks multidimensi. Jadi akan lebih alami untuk mengimplementasikan algoritma karena mereka didefinisikan daripada membuatnya lebih ramah "perangkat lunak" dengan mengorbankan kehilangan ikatan langsung ke makalah yang menjadi dasar algoritma.
Seperti yang saya katakan, dalam kasus-kasus ini Anda mungkin bisa lolos menggunakan daftar tetapi itu menambah lapisan kompleksitas di atas apa yang sudah algoritma kompleks.
sumber
Ini sebenarnya berlaku untuk bahasa lain yang memiliki daftar juga (seperti Java atau Visual Basic). Ada beberapa kasus di mana Anda perlu menggunakan array karena suatu metode mengembalikan sebuah array daripada sebuah Daftar.
Dalam program yang sebenarnya, saya tidak berpikir array akan digunakan sangat sering, tetapi kadang-kadang Anda tahu data akan menjadi ukuran yang tetap dan Anda menyukai kenaikan kinerja kecil yang Anda dapatkan dari menggunakan array. Mikro-optimasi akan menjadi alasan yang valid, sama seperti metode mengembalikan daftar, atau kebutuhan untuk struktur data multidimensi.
sumber
list<T>
manavector<T>
akan bekerja adalah ide buruk yang buruk di C / C ++.vector<T> x
mengkompilasi baik-baik saja bagi saya di C . :-)list<T>
. Pada dasarnya, saya telah melihat banyak masalah kinerja yang disebabkan oleh pengembang hanya menggunakan daftar secara default ketika array adalah pilihan yang lebih baik.Yah, saya menemukan penggunaan untuk array dalam permainan yang telah saya tulis. Saya menggunakannya untuk membuat sistem inventaris dengan jumlah slot tetap. Ini memiliki beberapa manfaat:
Saya pikir jika saya perlu "menambah" ukuran inventaris, saya bisa melakukannya dengan mentransfer item lama ke array baru, tetapi karena inventaris diperbaiki oleh ruang layar dan saya tidak perlu secara dinamis membuatnya lebih besar / lebih kecil, itu bekerja dengan baik untuk tujuan saya menggunakannya.
sumber
Jika Anda melintasi semua elemen daftar, maka tidak, array tidak diperlukan, 'selanjutnya' atau arbitrer 'pemilihan tanpa penggantian' akan baik-baik saja.
Tetapi jika algoritma Anda membutuhkan akses acak ke elemen-elemen dalam koleksi, maka, ya, sebuah array diperlukan.
Ini agak analog dengan "apakah perlu dilakukan?". Dalam bahasa modern yang masuk akal tidak diperlukan sama sekali. Tetapi jika Anda mengupas abstraksi, pada titik tertentu, hanya itu yang sebenarnya tersedia untuk Anda, yaitu, satu-satunya cara untuk mengimplementasikan abstraksi ini adalah dengan fitur 'tidak perlu'. (Tentu saja, analoginya tidak sempurna, saya tidak berpikir ada yang mengatakan bahwa array adalah praktek pemrograman yang buruk; mereka mudah dimengerti dan dipikirkan).
sumber
List<T>
.Kompatibilitas warisan.
Semua bentuk pengalaman pribadi:
Programer lama - kolega saya menggunakan array di mana-mana, telah melakukannya selama lebih dari 30 tahun, semoga berhasil mengubah pikirannya dengan ide-ide baru Anda yang ketinggalan jaman.
Kode lawas - foo (bilah array []) yakin Anda dapat menggunakan fungsi toarray daftar / vektor / koleksi tetapi jika Anda tidak menggunakan salah satu fitur tambahan, lebih mudah menggunakan array untuk memulainya, seringkali lebih mudah dibaca tanpa beralih jenis.
Legacy boss - bos saya adalah programmer yang baik sebelum dia pergi ke manajemen bertahun-tahun yang lalu dan masih berpikir dia up to date, "menggunakan array" dapat mengakhiri pertemuan, menjelaskan berapa koleksi yang dapat menghabiskan biaya makan siang untuk semua orang.
sumber
1) Tidak ada versi multidimensi Daftar. Jika data Anda memiliki lebih dari satu dimensi, akan sangat tidak efisien untuk menggunakan daftar.
2) Ketika Anda berhadapan dengan sejumlah besar tipe data kecil (katakanlah, peta di mana yang Anda miliki adalah satu byte untuk tipe terrain), mungkin ada perbedaan kinerja yang cukup besar karena caching. Versi array memuat beberapa item per memori yang dibaca, versi daftar memuat hanya satu. Selain itu, versi array menampung beberapa kali lebih banyak sel dalam cache daripada versi daftar - jika Anda berulang kali memproses data ini dapat membuat perbedaan besar jika versi array cocok dengan cache tetapi versi daftar tidak.
Untuk kasus ekstrem, pertimbangkan Minecraft. (Ya, itu tidak ditulis dalam bahasa C #. Alasan yang sama berlaku.)
sumber
T[,]
) lebih lambat dari array bergerigi yang setara (misalnyaT[][]
) .Array 100-elemen dari beberapa tipe T merangkum 100 variabel independen dari tipe T. Jika T adalah tipe nilai yang memiliki bidang publik yang bisa berubah dari tipe Q dan salah satu dari tipe R, maka setiap elemen dari array akan merangkum variabel independen tipe Q dan R. Array secara keseluruhan dengan demikian akan merangkum 100 variabel independen dari tipe Q dan 100 variabel independen dari tipe R; variabel-variabel tersebut dapat diakses secara individual tanpa mempengaruhi variabel lainnya. Tidak ada tipe koleksi selain array yang memungkinkan bidang struktur digunakan sebagai variabel independen.
Jika T kebetulan bukan tipe kelas dengan bidang publik yang bisa berubah dari tipe Q dan R, setiap elemen array memegang satu - satunya referensi, di mana saja di alam semesta, ke instance
T
, dan jika tidak ada elemen array yang akan pernah dimodifikasi untuk mengidentifikasi objek yang memiliki referensi luar, maka array akan secara efektif merangkum 100 variabel independen tipe Q dan 100 variabel independen tipe R. Jenis koleksi lainnya dapat meniru perilaku array seperti itu, tetapi jika satu-satunya tujuan array adalah untuk merangkum 100 variabel tipe Q dan 100 tipe R, merangkum setiap pasangan variabel dalam objek kelasnya sendiri adalah cara yang mahal untuk melakukan itu. Lebih lanjut,menggunakan array atau kumpulan tipe kelas yang dapat diubah menciptakan kemungkinan bahwa variabel yang diidentifikasi oleh elemen array mungkin tidak independen .Jika suatu tipe seharusnya berperilaku seperti semacam objek, maka itu haruslah tipe kelas atau struktur bidang pribadi yang tidak menyediakan sarana mutasi selain penggantian. Namun, jika suatu tipe seharusnya berperilaku seperti sekelompok variabel terkait-tetapi-independen yang menempel bersama lakban, maka seseorang harus menggunakan jenis yang merupakan sekelompok variabel yang menempel bersama lakban - sebuah struktur bidang terbuka . Susunan jenis tersebut sangat efisien untuk digunakan, dan memiliki semantik yang sangat bersih. Penggunaan jenis apa pun akan menyebabkan semantik yang kacau, kinerja yang lebih rendah, atau keduanya.
sumber
Satu perbedaan penting adalah alokasi memori. Sebagai contoh, melintasi daftar tertaut dapat mengakibatkan banyak kesalahan cache dan kinerja lebih lambat, sedangkan array mewakili potongan memori yang berdekatan yang menyimpan beberapa instance dari beberapa tipe data tertentu, dan melakukan traversenya agar lebih mungkin mengenai CPU. cache.
Tentu saja, array referensi objek mungkin tidak mendapat manfaat sebanyak dari hit cache, karena dereferencing masih bisa membawa Anda ke mana saja dalam memori.
Lalu ada implementasi daftar seperti ArrayList, yang mengimplementasikan daftar menggunakan array. Mereka primitif yang berguna untuk dimiliki.
sumber
List<T>
, yang tidak diimplementasikan menggunakan daftar tertaut, tetapi menggunakan array (pada dasarnya setara denganArrayList<T>
di Jawa).Berikut adalah beberapa panduan yang dapat Anda gunakan kapan harus memilih
Array
dan kapan harus memilihList
.Array
saat kembali dari suatu metode.List
sebagai variabel ketika Anda membangun nilai kembali (di dalam metode). Kemudian gunakan.ToArray()
ketika kembali dari metode.Secara umum, gunakan
Array
saat Anda tidak bermaksud konsumen untuk menambahkan item ke koleksi. GunakanList
saat Anda bermaksud konsumen untuk menambahkan item ke koleksi.Array
dimaksudkan untuk berurusan dengan koleksi "statis" sementaraList
itu dimaksudkan untuk berurusan dengan koleksi "dinamis".sumber
Array
alih-alihList
. Senang mendengar pikiran Anda!