Dan jika diperlukan, lakukan ls.ToArray () di akhir
Narayana
2
Menggunakan mekanik lain daripada bertanya dalam pertanyaan bukanlah jawaban.
user11909
@ user2190035: Tidak yakin dari mana Anda mendapatkan ide itu, dan 111 orang yang dipungut suara akan tidak setuju dengan Anda. Jika Anda tahu cara yang lebih baik untuk memperluas array maka dengan segala cara, mempostingnya. Saya ragu alokasi ulang dan salinan manual Anda akan lebih baik daripada menggunakan Daftar. Terkadang jawabannya adalah "jangan lakukan itu."
Ed S.
@ EdS. Pertanyaannya adalah, bagaimana cara menambahkan item ke array string yang ada , tetapi jawaban ini tidak memiliki array sama sekali, sebaliknya ia membuat Daftar baru <>. Dalam aplikasi saya, saya tidak dapat mengubah jenis ke Daftar <>, oleh karena itu saya harus mengubah ukuran array (membuat salinan ...). Jawaban oleh Ali Ersöz membantu saya.
user11909
@ user2190035: IEnumerable <T> .ToArray (). Saya menulis C # setiap hari dan saya tidak pernah harus mengubah ukuran array seperti itu.
@ Konrad, itu pasti akan menyimpan data dalam array.
Ali Ersöz
1
ini tidak cocok untuk lebih dari beberapa kali memohon. karena fungsi 'Resize' memiliki kinerja yang sangat besar. bug untuk satu atau dua kali, ini sangat bagus.
Saya suka menggunakan ini karena itu adalah satu-liner dan sangat nyaman untuk menanamkan dalam pernyataan switch, pernyataan if sederhana, atau lulus sebagai argumen.
EDIT:
Beberapa orang tidak suka new[] { newitem }karena itu menciptakan array sementara yang kecil, satu-item,. Berikut ini adalah versi yang menggunakan Enumerable.Repeatyang tidak memerlukan membuat objek apa pun (setidaknya tidak di permukaan - .NET iterators mungkin membuat banyak objek mesin negara di bawah tabel).
Perhatikan bahwa jika Anda ingin menambahkan item ke koleksi yang dipesan, Listmungkin struktur data yang Anda inginkan, bukan sebuah array untuk memulai.
+1 sangat bagus. Saya memiliki kode yang mirip dengan metode ekstensi generik. Saya telah memasukkan kode dalam jawaban ini: stackoverflow.com/a/11035286/673545
dblood
Ini sangat berguna menemukannya saat mencari "cara menambahkan ke array dalam satu baris kode di c #" - semoga komentar ini cukup untuk menemukannya lagi di lain waktu.
gary
28
Pertanyaan yang sangat lama, tetapi masih ingin menambahkan ini.
Jika Anda mencari satu-liner, Anda dapat menggunakan kode di bawah ini. Ini menggabungkan konstruktor daftar yang menerima sintaks initializer enumerable dan "baru" (sejak pertanyaan diajukan).
Seperti yang Anda lihat itu menciptakan array baru dengan ukuran baru, menyalin konten dari array sumber dan menetapkan referensi ke array baru. Petunjuk untuk ini adalah referensi kata kunci untuk parameter pertama.
Ada daftar yang secara dinamis dapat mengalokasikan slot baru untuk item baru. Ini misalnya Daftar <T> . Ini berisi array yang tidak dapat diubah dan ubah ukurannya saat diperlukan (Daftar <T> bukan implementasi daftar tertaut!). ArrayList adalah hal yang sama tanpa Generics (with array Object ).
LinkedList <T> adalah implementasi daftar tertaut yang nyata. Sayangnya, Anda hanya dapat menambahkan elemen <T> LinkListNode ke daftar, jadi Anda harus membungkus elemen daftar Anda sendiri ke dalam jenis simpul ini. Saya pikir penggunaannya tidak umum.
Anda dapat memperluas jawaban yang diberikan oleh @Stephen Chung dengan menggunakan logika berbasis LINQ untuk membuat metode ekstensi menggunakan tipe generik.
publicstaticclassCollectionHelper{publicstaticIEnumerable<T>Add<T>(thisIEnumerable<T> sequence, T item){return(sequence ??Enumerable.Empty<T>()).Concat(new[]{ item });}publicstatic T[]AddRangeToArray<T>(this T[] sequence, T[] items){return(sequence ??Enumerable.Empty<T>()).Concat(items).ToArray();}publicstatic T[]AddToArray<T>(this T[] sequence, T item){returnAdd(sequence, item).ToArray();}}
Anda kemudian dapat memanggilnya langsung pada array seperti ini.
publicvoidAddToArray(string[] options){// Add one item
options = options.AddToArray("New Item");// Add a
options = options.AddRangeToArray(newstring[]{"one","two","three"});// Do stuff...}
Memang, metode AddRangeToArray () tampaknya agak berlebihan karena Anda memiliki fungsi yang sama dengan Concat () tetapi cara ini kode akhir dapat "bekerja" dengan array secara langsung sebagai lawan dari ini:
jika Anda banyak bekerja dengan array dan bukan daftar karena alasan tertentu, metode generik yang diketik generik yang diketik ini Addmungkin membantu
publicstatic T[]Add<T>(T[]array, T item){
T[] returnarray =new T[array.Length+1];for(int i =0; i <array.Length; i++){
returnarray[i]=array[i];}
returnarray[array.Length]= item;return returnarray;}
Semua jawaban yang diajukan melakukan hal yang sama dengan apa yang mereka katakan ingin mereka hindari, membuat array baru dan menambahkan entri baru di dalamnya hanya dengan kehilangan lebih banyak overhead. LINQ bukan sihir, daftar T adalah array dengan ruang buffer dengan beberapa ruang ekstra untuk menghindari mengubah ukuran array batin ketika item ditambahkan.
Semua abstraksi harus menyelesaikan masalah yang sama, membuat array tanpa slot kosong yang menampung semua nilai dan mengembalikannya.
Jika Anda memerlukan fleksibilitas, dapat membuat daftar yang cukup besar yang dapat Anda gunakan untuk lulus lalu lakukan itu. lain gunakan array dan bagikan objek yang aman itu. Juga, Rentang baru membantu berbagi data tanpa harus menyalin daftar di sekitar.
string[] sourceArray =new[]{"foo","bar"}string additionalItem ="foobar";string result = sourceArray.Union(additionalItem);
Perhatikan ini meniru perilaku ekstensi Unionion Linq ini (digunakan untuk menggabungkan dua array menjadi yang baru), dan mengharuskan pustaka Linq berfungsi.
Sayangnya menggunakan daftar tidak akan berfungsi dalam semua situasi. Daftar dan array sebenarnya berbeda dan tidak dapat dipertukarkan 100%. Itu akan tergantung pada keadaan jika ini akan menjadi pekerjaan yang dapat diterima.
Itu bisa menjadi solusi;
Tetapi untuk array berukuran dinamis saya lebih suka daftar juga.
sumber
Menggunakan LINQ:
Saya suka menggunakan ini karena itu adalah satu-liner dan sangat nyaman untuk menanamkan dalam pernyataan switch, pernyataan if sederhana, atau lulus sebagai argumen.
EDIT:
Beberapa orang tidak suka
new[] { newitem }
karena itu menciptakan array sementara yang kecil, satu-item,. Berikut ini adalah versi yang menggunakanEnumerable.Repeat
yang tidak memerlukan membuat objek apa pun (setidaknya tidak di permukaan - .NET iterators mungkin membuat banyak objek mesin negara di bawah tabel).Dan jika Anda yakin bahwa array tidak pernah
null
memulai, Anda dapat menyederhanakannya menjadi:Perhatikan bahwa jika Anda ingin menambahkan item ke koleksi yang dipesan,
List
mungkin struktur data yang Anda inginkan, bukan sebuah array untuk memulai.sumber
Pertanyaan yang sangat lama, tetapi masih ingin menambahkan ini.
Jika Anda mencari satu-liner, Anda dapat menggunakan kode di bawah ini. Ini menggabungkan konstruktor daftar yang menerima sintaks initializer enumerable dan "baru" (sejak pertanyaan diajukan).
sumber
Array dalam C # tidak dapat diubah , misalnya
string[]
,int[]
. Itu berarti Anda tidak dapat mengubah ukurannya. Anda perlu membuat array baru.Berikut ini adalah kode untuk Array.Resize :
Seperti yang Anda lihat itu menciptakan array baru dengan ukuran baru, menyalin konten dari array sumber dan menetapkan referensi ke array baru. Petunjuk untuk ini adalah referensi kata kunci untuk parameter pertama.
Ada daftar yang secara dinamis dapat mengalokasikan slot baru untuk item baru. Ini misalnya Daftar <T> . Ini berisi array yang tidak dapat diubah dan ubah ukurannya saat diperlukan (Daftar <T> bukan implementasi daftar tertaut!). ArrayList adalah hal yang sama tanpa Generics (with array Object ).
LinkedList <T> adalah implementasi daftar tertaut yang nyata. Sayangnya, Anda hanya dapat menambahkan elemen <T> LinkListNode ke daftar, jadi Anda harus membungkus elemen daftar Anda sendiri ke dalam jenis simpul ini. Saya pikir penggunaannya tidak umum.
sumber
Aray.Resize
dapat mengubah ukuran array tanpa kehilangan kontennya. docs.microsoft.com/en-us/dotnet/api/…sumber
Anda dapat memperluas jawaban yang diberikan oleh @Stephen Chung dengan menggunakan logika berbasis LINQ untuk membuat metode ekstensi menggunakan tipe generik.
Anda kemudian dapat memanggilnya langsung pada array seperti ini.
Memang, metode AddRangeToArray () tampaknya agak berlebihan karena Anda memiliki fungsi yang sama dengan Concat () tetapi cara ini kode akhir dapat "bekerja" dengan array secara langsung sebagai lawan dari ini:
sumber
Lebih baik untuk menjaga ukuran Array tetap dan tetap.
Anda dapat mensimulasikan
Add
olehExtension Method
danIEnumerable.Concat()
sumber
jika Anda banyak bekerja dengan array dan bukan daftar karena alasan tertentu, metode generik yang diketik generik yang diketik ini
Add
mungkin membantusumber
Semua jawaban yang diajukan melakukan hal yang sama dengan apa yang mereka katakan ingin mereka hindari, membuat array baru dan menambahkan entri baru di dalamnya hanya dengan kehilangan lebih banyak overhead. LINQ bukan sihir, daftar T adalah array dengan ruang buffer dengan beberapa ruang ekstra untuk menghindari mengubah ukuran array batin ketika item ditambahkan.
Semua abstraksi harus menyelesaikan masalah yang sama, membuat array tanpa slot kosong yang menampung semua nilai dan mengembalikannya.
Jika Anda memerlukan fleksibilitas, dapat membuat daftar yang cukup besar yang dapat Anda gunakan untuk lulus lalu lakukan itu. lain gunakan array dan bagikan objek yang aman itu. Juga, Rentang baru membantu berbagi data tanpa harus menyalin daftar di sekitar.
Untuk menjawab pertanyaan:
sumber
Jadi jika Anda memiliki array yang sudah ada, perbaikan cepat saya akan
Sekarang ganti saja array asli dengan yang baru
sumber
Append<TSource>
Metode baru telah ditambahkan keIEnumerable<TSource>
sejak .NET Framework 4.7.1 dan .NET Core 1.0.Berikut cara menggunakannya:
Perhatikan bahwa jika Anda ingin menambahkan elemen di awal array, Anda bisa menggunakan
Prepend<TSource>
metode baru .sumber
Menggunakan daftar akan menjadi pilihan terbaik Anda untuk manajemen memori.
sumber
Bagaimana dengan menggunakan metode ekstensi? Misalnya:
misalnya:
Perhatikan ini meniru perilaku ekstensi Unionion Linq ini (digunakan untuk menggabungkan dua array menjadi yang baru), dan mengharuskan pustaka Linq berfungsi.
sumber
Saya setuju dengan Ed. C # tidak mempermudah VB dengan ReDim Preserve. Tanpa koleksi, Anda harus menyalin array ke array yang lebih besar.
sumber
ReDim Preserve
cukup salin array ke lager. Tidak ada perubahan ukuran array yang ajaib.sumber
sumber
Mengapa tidak mencoba menggunakan kelas Stringbuilder . Ini memiliki metode seperti. Masukkan dan. Tambahkan. Anda dapat membaca lebih lanjut tentang ini di sini: http://msdn.microsoft.com/en-us/library/2839d5h5(v=vs.71).aspx
sumber
Sayangnya menggunakan daftar tidak akan berfungsi dalam semua situasi. Daftar dan array sebenarnya berbeda dan tidak dapat dipertukarkan 100%. Itu akan tergantung pada keadaan jika ini akan menjadi pekerjaan yang dapat diterima.
sumber
Karena pertanyaan ini tidak puas dengan jawaban yang diberikan, saya ingin menambahkan jawaban ini :)
sumber