Menambahkan nilai ke array C #

512

Mungkin yang sangat sederhana ini - Saya mulai dengan C # dan perlu menambahkan nilai ke array, misalnya:

int[] terms;

for(int runs = 0; runs < 400; runs++)
{
    terms[] = runs;
}

Bagi mereka yang telah menggunakan PHP, inilah yang saya coba lakukan di C #:

$arr = array();
for ($i = 0; $i < 10; $i++) {
    $arr[] = $i;
}
Ross
sumber
10
Seharusnya 'istilah [] = nilai;' menjadi 'istilah [] = berjalan;'?
tymtam
Di C #, Anda tidak dapat mengubah ukuran array setelah dibuat. Jika Anda menginginkan sesuatu seperti array tetapi dapat menambah / menghapus elemen, gunakan Daftar <int> ().
Kamran Bigdely

Jawaban:

822

Anda bisa melakukan ini -

int[] terms = new int[400];
for (int runs = 0; runs < 400; runs++)
{
    terms[runs] = value;
}

Atau, Anda dapat menggunakan Daftar - keuntungan dengan daftar adalah, Anda tidak perlu tahu ukuran array saat membuat daftar.

List<int> termsList = new List<int>();
for (int runs = 0; runs < 400; runs++)
{
    termsList.Add(value);
}

// You can convert it back to an array if you would like to
int[] terms = termsList.ToArray();

Sunting: a) untuk loop pada Daftar <T> sedikit lebih dari 2 kali lebih murah daripada loop foreach pada Daftar <T>, b) Looping pada array sekitar 2 kali lebih murah daripada looping pada Daftar <T>, c) looping on menggunakan array for 5 kali lebih murah daripada mengulang pada Daftar <T> menggunakan foreach (yang kebanyakan dari kita lakukan).

Tamas Czinege
sumber
2
Apa keuntungan menggunakan daftar dalam skenario ini?
Phill Healey
9
@PhillHealey Anda tidak perlu "tahu" seberapa besar arraynya, sebelum Anda membuatnya. Seperti yang Anda lihat, dalam contoh-contoh ini, OP harus memberi nilai pada "new int [400]" - tetapi dengan daftarnya, ia tidak harus melakukannya.
Hejner
3
Bukankah bit kode pertama tidak akan apa-apa karena nilainya tidak didefinisikan di mana pun. -_-
EasyBB
1
Mengapa Anda mengatakan bahwa ARRAY perlu memiliki ukuran ??? lakukan saja new int[]{}!!!!!
T.Todua
6
@ T.Todua jika Anda membuat array kosong seperti yang Anda sarankan dan kemudian mencoba mengakses indeks yang tidak ada untuk menetapkan nilai, Anda akan mendapatkan OutOfRangeExceptionsegera setelah Anda menjalankan kode. Array harus diinisialisasi dengan ukuran yang akan Anda gunakan, mereka memesan semua ruang di awal, penyihir membuatnya sangat cepat, tetapi tidak mungkin bagi mereka untuk diubah ukurannya.
KinSlayerUY
85

Jika Anda menulis dalam C # 3, Anda dapat melakukannya dengan satu kalimat:

int[] terms = Enumerable.Range(0, 400).ToArray();

Cuplikan kode ini mengasumsikan bahwa Anda memiliki arahan penggunaan untuk System.Linq di bagian atas file Anda.

Di sisi lain, jika Anda mencari sesuatu yang dapat diubah ukurannya secara dinamis, seperti yang terjadi pada PHP (Saya tidak pernah benar-benar mempelajarinya), maka Anda mungkin ingin menggunakan Daftar alih-alih int [] . Inilah yang yang kode akan terlihat seperti:

List<int> terms = Enumerable.Range(0, 400).ToList();

Namun, perhatikan bahwa Anda tidak bisa menambahkan elemen ke-401 hanya dengan menyetel istilah [400] ke suatu nilai. Anda malah perlu memanggil Tambah (), seperti ini:

terms.Add(1337);
David Mitchell
sumber
65

Menggunakan metode Linq , Concat membuat ini mudah

int[] array = new int[] { 3, 4 };

array = array.Concat(new int[] { 2 }).ToArray();

hasil 3,4,2

Yitzhak Weinberg
sumber
12
Metode ini akan membuat menambahkan 400 item ke array membuat salinan array dengan satu ruang lagi dan memindahkan semua elemen ke array baru, 400 ratus kali. jadi tidak disarankan kinerja bijaksana.
KinSlayerUY
39

Jawaban tentang cara melakukannya menggunakan array disediakan di sini.

Namun, C # memiliki hal yang sangat berguna yang disebut System.Collections :)

Koleksi adalah alternatif yang bagus untuk menggunakan array, meskipun banyak dari mereka menggunakan array secara internal.

Sebagai contoh, C # memiliki koleksi yang disebut Daftar yang fungsinya sangat mirip dengan array PHP.

using System.Collections.Generic;

// Create a List, and it can only contain integers.
List<int> list = new List<int>();

for (int i = 0; i < 400; i++)
{
   list.Add(i);
}
FlySwat
sumber
untuk mengambil elemen daftar: int a = list [i];
Behzad
10

Menggunakan Daftar sebagai perantara adalah cara termudah, seperti yang dijelaskan orang lain, tetapi karena input Anda adalah array dan Anda tidak hanya ingin menyimpan data dalam Daftar, saya kira Anda mungkin khawatir tentang kinerja.

Metode yang paling efisien kemungkinan mengalokasikan array baru dan kemudian menggunakan Array.Copy atau Array.CopyTo. Ini tidak sulit jika Anda hanya ingin menambahkan item ke akhir daftar:

public static T[] Add<T>(this T[] target, T item)
{
    if (target == null)
    {
        //TODO: Return null or throw ArgumentNullException;
    }
    T[] result = new T[target.Length + 1];
    target.CopyTo(result, 0);
    result[target.Length] = item;
    return result;
}

Saya juga dapat memposting kode untuk metode ekstensi Sisipkan yang mengambil indeks tujuan sebagai input, jika diinginkan. Ini sedikit lebih rumit dan menggunakan metode statis Array.Copy 1-2 kali.

Thracx
sumber
2
Akan jauh lebih baik, kinerja bijaksana untuk membuat daftar, mengisinya dan kemudian melakukan copy ini ke array di akhir, sehingga Anda tidak membuat dan menyalin array berulang-ulang 400 kali
KinSlayerUY
10

Berdasarkan jawaban Thracx (saya tidak punya cukup poin untuk menjawab):

public static T[] Add<T>(this T[] target, params T[] items)
    {
        // Validate the parameters
        if (target == null) {
            target = new T[] { };
        }
        if (items== null) {
            items = new T[] { };
        }

        // Join the arrays
        T[] result = new T[target.Length + items.Length];
        target.CopyTo(result, 0);
        items.CopyTo(result, target.Length);
        return result;
    }

Ini memungkinkan untuk menambahkan lebih dari satu item ke array, atau hanya meneruskan array sebagai parameter untuk bergabung dengan dua array.

Menandai
sumber
8

Anda harus mengalokasikan array terlebih dahulu:

int [] terms = new int[400]; // allocate an array of 400 ints
for(int runs = 0; runs < terms.Length; runs++) // Use Length property rather than the 400 magic number again
{
    terms[runs] = value;
}
Motti
sumber
5
int ArraySize = 400;

int[] terms = new int[ArraySize];


for(int runs = 0; runs < ArraySize; runs++)
{

    terms[runs] = runs;

}

Itu akan menjadi bagaimana saya mengkodekannya.

JB King
sumber
3

Array C # adalah panjang tetap dan selalu diindeks. Pergi dengan solusi Motti:

int [] terms = new int[400];
for(int runs = 0; runs < 400; runs++)
{
    terms[runs] = value;
}

Perhatikan bahwa array ini adalah array yang padat, blok bersebelahan dari 400 byte di mana Anda dapat menjatuhkan sesuatu. Jika Anda menginginkan array berukuran dinamis, gunakan Daftar <int>.

List<int> terms = new List<int>();
for(int runs = 0; runs < 400; runs ++)
{
    terms.Add(runs);
}

Baik int [] maupun Daftar <int> adalah array asosiatif - yang akan menjadi Kamus <> dalam C #. Baik array dan daftar padat.

Jimmy
sumber
2
int[] terms = new int[10]; //create 10 empty index in array terms

//fill value = 400 for every index (run) in the array
//terms.Length is the total length of the array, it is equal to 10 in this case 
for (int run = 0; run < terms.Length; run++) 
{
    terms[run] = 400;
}

//print value from each of the index
for (int run = 0; run < terms.Length; run++)
{
    Console.WriteLine("Value in index {0}:\t{1}",run, terms[run]);
}

Console.ReadLine();

/*Keluaran:

Nilai dalam indeks 0: 400
Nilai dalam indeks 1: 400
Nilai dalam indeks 2: 400
Nilai dalam indeks 3: 400
Nilai dalam indeks 4: 400
Nilai dalam indeks 5: 400
Nilai dalam indeks 6: 400
Nilai dalam indeks 7: 400
Nilai dalam indeks index 8: 400
Nilai dalam indeks 9: 400
* /

jhyap
sumber
Bisakah Anda menjelaskan solusi ini?
Deep Frozen
Rune, saya baru saja memasukkan komentar di dalam kode sumber> Semoga ini bisa menjawab pertanyaan Anda.
jhyap
2

Anda tidak bisa hanya menambahkan elemen ke array dengan mudah. Anda dapat mengatur elemen pada posisi tertentu sebagai fallen888 diuraikan, tapi saya sarankan untuk menggunakan List<int>atau Collection<int>sebaliknya, dan penggunaan ToArray()jika Anda membutuhkannya dikonversi ke dalam sebuah array.

Michael Stum
sumber
2

Jika Anda benar-benar membutuhkan array, berikut ini mungkin yang paling sederhana:

using System.Collections.Generic;

// Create a List, and it can only contain integers.
List<int> list = new List<int>();

for (int i = 0; i < 400; i++)
{
   list.Add(i);
}

int [] terms = list.ToArray();
Steve
sumber
2

Saya akan menambahkan ini untuk varian lain. Saya lebih suka jenis garis coding fungsional lebih.

Enumerable.Range(0, 400).Select(x => x).ToArray();
David
sumber
1

Jika Anda tidak tahu ukuran Array atau sudah memiliki larik yang sudah Anda tambahkan. Anda dapat melakukannya dengan dua cara. Yang pertama menggunakan generik List<T>: Untuk melakukan ini, Anda akan ingin mengubah array menjadi a var termsList = terms.ToList();dan menggunakan metode Tambahkan. Kemudian setelah selesai gunakan var terms = termsList.ToArray();metode untuk mengkonversi kembali ke array.

var terms = default(int[]);
var termsList = terms == null ? new List<int>() : terms.ToList();

for(var i = 0; i < 400; i++)
    termsList.Add(i);

terms = termsList.ToArray();

Cara kedua adalah mengubah ukuran array saat ini:

var terms = default(int[]);

for(var i = 0; i < 400; i++)
{
    if(terms == null)
        terms = new int[1];
    else    
        Array.Resize<int>(ref terms, terms.Length + 1);

    terms[terms.Length - 1] = i;
}

Jika Anda menggunakan .NET 3.5 Array.Add(...);

Kedua hal ini akan memungkinkan Anda melakukannya secara dinamis. Jika Anda akan menambahkan banyak item maka cukup gunakan a List<T>. Jika hanya beberapa item maka itu akan memiliki kinerja yang lebih baik dengan mengubah ukuran array. Ini karena Anda mengambil lebih banyak hit untuk membuatList<T> objek.

Waktu dalam kutu:

3 item

Waktu Ubah Ukuran Array: 6

Daftar Tambah Waktu: 16

400 item

Waktu Ubah Ukuran Array: 305

Daftar Tambah Waktu: 20

LCarter
sumber
1

Hanya pendekatan yang berbeda:

int runs = 0; 
bool batting = true; 
string scorecard;

while (batting = runs < 400)
    scorecard += "!" + runs++;

return scorecard.Split("!");
Ali Humayun
sumber
3
Meskipun sedikit baru, ini melakukan banyak penggabungan string dan kemudian melakukan operasi enumerasi besar! Bukan cara yang paling berkinerja, atau mudah dimengerti / dibaca tentang hal ini.
BradleyDotNET
@ Ali Humayun apakah Anda benar-benar berniat menggunakan operator penugasan =alih-alih operator pembanding? Anda bisa meninggalkan variabel battling dan gunakan runs < 400untuk mengontrol loop.
Steve
hanya berlatih pemrograman entender ganda
Ali Humayun
1

satu pendekatan adalah mengisi array melalui LINQ

jika Anda ingin mengisi array dengan satu elemen, Anda cukup menulis

string[] arrayToBeFilled;
arrayToBeFilled= arrayToBeFilled.Append("str").ToArray();

Selanjutnya, Jika Anda ingin mengisi array dengan beberapa elemen, Anda dapat menggunakan kode sebelumnya dalam satu lingkaran

//the array you want to fill values in
string[] arrayToBeFilled;
//list of values that you want to fill inside an array
List<string> listToFill = new List<string> { "a1", "a2", "a3" };
//looping through list to start filling the array

foreach (string str in listToFill){
// here are the LINQ extensions
arrayToBeFilled= arrayToBeFilled.Append(str).ToArray();
}
Safi Habhab
sumber
0
int[] terms = new int[400];

for(int runs = 0; runs < 400; runs++)
{
    terms[runs] = value;
}
Johnno Nolan
sumber
0
         static void Main(string[] args)
        {
            int[] arrayname = new int[5];/*arrayname is an array of 5 integer [5] mean in array [0],[1],[2],[3],[4],[5] because array starts with zero*/
            int i, j;


          /*initialize elements of array arrayname*/
            for (i = 0; i < 5; i++)
            {
                arrayname[i] = i + 100;
            }

             /*output each array element value*/
            for (j = 0; j < 5; j++)
            {
                Console.WriteLine("Element and output value [{0}]={1}",j,arrayname[j]);
            }
            Console.ReadKey();/*Obtains the next character or function key pressed by the user.
                                The pressed key is displayed in the console window.*/
        }
pengguna3404904
sumber
0
            /*arrayname is an array of 5 integer*/
            int[] arrayname = new int[5];
            int i, j;
            /*initialize elements of array arrayname*/
            for (i = 0; i < 5; i++)
            {
                arrayname[i] = i + 100;
            }
pengguna3404904
sumber
0

Untuk menambahkan nilai daftar ke array string menggunakan C # tanpa menggunakan metode ToArray ()

        List<string> list = new List<string>();
        list.Add("one");
        list.Add("two");
        list.Add("three");
        list.Add("four");
        list.Add("five");
        string[] values = new string[list.Count];//assigning the count for array
        for(int i=0;i<list.Count;i++)
        {
            values[i] = list[i].ToString();
        }

Output dari array nilai mengandung:

satu

dua

tiga

empat

lima

Maghalakshmi Saravana
sumber