int[] x = new int [] { 1, 2, 3};
int[] y = new int [] { 4, 5 };
int[] z = // your answer here...
Debug.Assert(z.SequenceEqual(new int[] { 1, 2, 3, 4, 5 }));
Saat ini saya menggunakan
int[] z = x.Concat(y).ToArray();
Apakah ada metode yang lebih mudah atau lebih efisien?
Jawaban:
sumber
params
parameter nomor variabel .System.IO.Directory.GetFiles()
mengembalikan array string.Coba ini:
sumber
List<int> list = new List<int>(x);
Anda dapat menulis metode ekstensi:
Kemudian:
sumber
Copy
lebih cepat dariCopyTo
? Mau menguraikan?Saya memilih solusi tujuan umum yang memungkinkan menggabungkan serangkaian array satu dimensi dari tipe yang sama. (Saya menggabungkan 3+ sekaligus.)
Fungsi saya:
Dan penggunaan:
sumber
params T[][]
untukthis T[][]
untuk membuatnya perpanjangan.Ini dia:
sumber
int[] result = array1.ToList().Concat(array2.ToList()).toArray();
Anda, Anda tidak dapat menerapkan Concat pada array secara langsung, saya yakintoArray()
Cannot implicitly convert type 'System.Collections.Generic.IEnumerable<string>' to 'string[]'. An explicit conversion exists (are you missing a cast?)
int[] result = ?
, Anda menyembunyikan masalah jawaban Andavar
di belakang bahwa hasil Anda akanIEnumerable<int>
, bukanint[]
. (salah satu alasan mengapa saya tidak sukavar
pada metode pengembalian).ToArray()
panggilan, kode ini tidak akan mengembalikan array yang sebenarnya sehingga juga merupakan jawaban yang salah.Anda dapat menerima panggilan ToArray () dari ujung. Apakah ada alasan Anda membutuhkannya menjadi array setelah panggilan ke Concat?
Calling Concat menciptakan iterator pada kedua array. Itu tidak membuat array baru sehingga Anda belum menggunakan lebih banyak memori untuk array baru. Ketika Anda memanggil ToArray, Anda benar-benar membuat array baru dan mengambil memori untuk array baru.
Jadi jika Anda hanya perlu dengan mudah beralih ke keduanya maka cukup hubungi Concat.
sumber
Saya tahu OP hanya sedikit ingin tahu tentang kinerja. Array yang lebih besar itu mungkin mendapatkan hasil yang berbeda (lihat @urdishTree). Dan itu biasanya tidak masalah (@ jordan.peoples). Tidak kurang, saya penasaran dan karena itu kehilangan akal (seperti @TigerShark menjelaskan) .... Maksud saya, saya menulis tes sederhana berdasarkan pertanyaan awal .... dan semua jawaban ....
Hasilnya adalah:
Gulung kemenangan Anda sendiri.
sumber
CopyTo
akan menjadi yang paling cepat dan ~ 3x lebih cepat daripadaRoll your own
.Hati-hati dengan
Concat
metodenya. Posting Array Concatenation dalam C # menjelaskan bahwa:Akan tidak efisien untuk array besar. Itu berarti
Concat
metode ini hanya untuk array berukuran meduim (hingga 10.000 elemen).sumber
sumber
Lebih efisien (cepat) untuk menggunakan
Buffer.BlockCopy
lebihArray.CopyTo
,Saya menulis sebuah program pengujian sederhana yang "menghangatkan Jitter", dikompilasi dalam mode rilis dan menjalankannya tanpa debugger terpasang, di mesin saya.
Untuk 10.000.000 iterasi contoh dalam pertanyaan
Jika saya mengubah array tes menjadi dua urutan dari 0 hingga 99 maka saya mendapatkan hasil yang mirip dengan ini,
Dari hasil ini saya dapat menyatakan bahwa metode
CopyTo
danBlockCopy
secara signifikan lebih efisien daripadaConcat
dan selanjutnya, jika kinerja adalah tujuan,BlockCopy
memiliki nilai lebihCopyTo
.Untuk menolak jawaban ini, jika kinerja tidak masalah, atau akan ada beberapa iterasi memilih metode yang Anda temukan paling mudah.
Buffer.BlockCopy
memang menawarkan beberapa utilitas untuk konversi tipe di luar cakupan pertanyaan ini.sumber
Jawaban Terlambat :-).
sumber
Struktur yang paling efisien dalam hal RAM (dan CPU) untuk menampung array gabungan adalah kelas khusus yang mengimplementasikan IEnumerable (atau jika Anda ingin bahkan berasal dari Array) dan menghubungkan secara internal ke array asli untuk membaca nilai-nilai. AFAIK Concat melakukan hal itu.
Dalam kode sampel Anda, Anda dapat menghilangkan .ToArray (), yang akan membuatnya lebih efisien.
sumber
Maaf untuk menghidupkan kembali utas lama, tetapi bagaimana dengan ini:
Kemudian dalam kode Anda:
Sampai Anda menelepon
.ToArray()
,,.ToList()
atau.ToDictionary(...)
, memori tidak dialokasikan, Anda bebas untuk "membangun permintaan Anda" dan baik memanggil salah satu dari ketiganya untuk menjalankannya atau hanya melalui semuanya dengan menggunakanforeach (var i in z){...}
klausa yang mengembalikan item pada suatu waktu dariyield return t;
atas...Fungsi di atas dapat dibuat menjadi ekstensi sebagai berikut:
Jadi dalam kode, Anda dapat melakukan sesuatu seperti:
Sisanya sama dengan sebelumnya.
Satu perbaikan lain untuk ini akan berubah
T[]
menjadiIEnumerable<T>
(sehinggaparams T[][]
menjadiparams IEnumerable<T>[]
) untuk membuat fungsi-fungsi ini menerima lebih dari sekadar array.Semoga ini membantu.
sumber
Anda dapat melakukannya dengan cara yang telah Anda sebutkan, atau jika Anda ingin benar-benar manual tentang hal itu Anda dapat memutar loop Anda sendiri:
sumber
Saya telah menemukan solusi satu baris yang elegan menggunakan ekspresi LINQ atau Lambda , keduanya bekerja sama (LINQ dikonversi ke Lambda ketika program dikompilasi). Solusinya bekerja untuk semua jenis array dan sejumlah array.
Menggunakan LINQ:
Menggunakan Lambda:
Saya telah menyediakan keduanya untuk preferensi seseorang. Solusi kinerja @Sergey Shteyn atau @ deepee1 sedikit lebih cepat, ekspresi Lambda menjadi yang paling lambat. Waktu yang dibutuhkan tergantung pada jenis elemen array, tetapi kecuali jika ada jutaan panggilan, tidak ada perbedaan yang signifikan antara metode.
sumber
Yang perlu Anda ingat adalah bahwa ketika menggunakan LINQ Anda memanfaatkan eksekusi tertunda. Metode lain yang dijelaskan di sini semuanya bekerja dengan sempurna, tetapi mereka dieksekusi segera. Lebih lanjut, fungsi Concat () mungkin dioptimalkan dengan cara yang tidak dapat Anda lakukan sendiri (panggilan ke API internal, panggilan OS, dll.). Pokoknya, kecuali jika Anda benar-benar perlu mencoba dan mengoptimalkan, Anda saat ini berada di jalur Anda ke "root of all evil";)
sumber
Coba yang berikut ini:
sumber
Inilah jawaban saya:
Metode ini dapat digunakan pada level inisialisasi, misalnya untuk menentukan rangkaian statis array statis:
Namun, ada dua peringatan yang perlu Anda pertimbangkan:
Concat
Metode menciptakan iterator lebih baik array: tidak membuat array baru, sehingga menjadi efisien dalam hal memori yang digunakan: Namun, berikutnyaToArray
akan meniadakan keuntungan seperti itu, karena benar-benar akan membuat array baru dan mengambil memori untuk array baru.Concat
akan agak tidak efisien untuk array besar: seharusnya hanya digunakan untuk array berukuran sedang.Jika membidik kinerja adalah suatu keharusan, metode berikut ini dapat digunakan sebagai gantinya:
Atau (untuk penggemar satu liners):
Meskipun metode terakhir jauh lebih elegan, yang pertama jelas lebih baik untuk kinerja.
Untuk info tambahan, silakan merujuk ke posting ini di blog saya.
sumber
Bagi int [] apa yang telah Anda lakukan terlihat baik bagi saya. jawaban astander juga cocok untuknya
List<int>
.sumber
Untuk array yang lebih kecil <10.000 elemen:
sumber
Saya pikir solusi di atas lebih umum & lebih ringan daripada yang saya lihat di sini. Ini lebih umum karena tidak membatasi penggabungan hanya untuk dua array dan lebih ringan karena tidak menggunakan LINQ atau Daftar.
Perhatikan bahwa solusinya singkat dan tambahan umum tidak menambah overhead runtime yang signifikan.
sumber
int [] x = int baru [] {1, 2, 3}; int [] y = int baru [] {4, 5};
int [] z = x.Union (y) .ToArray ();
sumber
Union
bukan cara yang sangat baik untuk melakukan ini karena secara implisit memanggilDistinct
dan menghapus duplikat dari koleksi yang bergabung.Concat
jauh lebih baik, tetapi sudah ada di pertanyaan awal.sumber