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;
}

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).


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);

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


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);
}

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.


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.


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;
}

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.


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.


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
* /


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.


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();

2

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

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

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


1

Hanya pendekatan yang berbeda:

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

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

return scorecard.Split("!");

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();
}

0
int[] terms = new int[400];

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

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.*/
        }

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;
            }

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.