Semua sintaks inisialisasi array yang dimungkinkan

Jawaban:

779

Ini adalah deklarasi dan metode inisialisasi saat ini untuk array sederhana.

string[] array = new string[2]; // creates array of length 2, default values
string[] array = new string[] { "A", "B" }; // creates populated array of length 2
string[] array = { "A" , "B" }; // creates populated array of length 2
string[] array = new[] { "A", "B" }; // created populated array of length 2

Perhatikan bahwa ada teknik lain untuk mendapatkan array, seperti ToArray()ekstensi Linq aktif IEnumerable<T>.

Perhatikan juga bahwa dalam deklarasi di atas, dua yang pertama dapat menggantikan yang string[]di sebelah kiri dengan var(C # 3+), karena informasi di sebelah kanan sudah cukup untuk menyimpulkan jenis yang tepat. Baris ketiga harus ditulis seperti yang ditampilkan, karena sintaks inisialisasi array saja tidak cukup untuk memenuhi tuntutan kompiler. Yang keempat juga bisa menggunakan inferensi. Jadi, jika Anda tertarik dengan keseluruhan singkatnya, hal di atas dapat ditulis sebagai

var array = new string[2]; // creates array of length 2, default values
var array = new string[] { "A", "B" }; // creates populated array of length 2
string[] array = { "A" , "B" }; // creates populated array of length 2
var array = new[] { "A", "B" }; // created populated array of length 2 
Anthony Pegram
sumber
1
Karena penasaran, dapatkah seseorang menjelaskan mengapa ekspresi inisialisasi pada baris ke-3 tidak dapat digunakan dengan sendirinya (misalnya diteruskan ke metode) atau ditugaskan ke varvariabel?
Ruben9922
1
@ Ruben9922: Pertanyaan menarik. Akan masuk akal bahwa var x = {}tidak berfungsi jika penginisialisasi array dapat menghasilkan apa pun selain array, tapi saya tidak akan tahu apa itu. Jadi saya kira penginisialisasi array adalah fitur bahasa. Jika Anda menggunakannya dengan new List<string> {"A", "B"}itu menghasilkan sesuatu yang berbeda juga.
TvdH
441

Sintaks pembuatan array dalam C # yang merupakan ekspresi adalah:

new int[3]
new int[3] { 10, 20, 30 }
new int[] { 10, 20, 30 }
new[] { 10, 20, 30 }

Dalam yang pertama, ukurannya bisa berupa nilai integral non-negatif dan elemen array diinisialisasi ke nilai default.

Dalam yang kedua, ukurannya harus konstan dan jumlah elemen yang diberikan harus cocok. Harus ada konversi implisit dari elemen yang diberikan ke tipe elemen array yang diberikan.

Pada yang ketiga, elemen harus secara implisit dapat dikonversi ke tipe elemen, dan ukurannya ditentukan dari jumlah elemen yang diberikan.

Pada yang keempat jenis elemen array disimpulkan dengan menghitung tipe terbaik, jika ada, dari semua elemen yang diberikan yang memiliki tipe. Semua elemen harus secara implisit dapat dikonversi ke tipe itu. Ukuran ditentukan dari jumlah elemen yang diberikan. Sintaks ini diperkenalkan di C # 3.0.

Ada juga sintaks yang hanya dapat digunakan dalam deklarasi:

int[] x = { 10, 20, 30 };

Elemen-elemen harus secara implisit dapat dikonversi ke tipe elemen. Ukuran ditentukan dari jumlah elemen yang diberikan.

tidak ada panduan lengkap

Saya merujuk Anda ke spesifikasi C # 4.0, bagian 7.6.10.4 "Ekspresi Pembuatan Array".

Eric Lippert
sumber
8
@BoltClock: Sintaks pertama yang Anda sebutkan adalah "ekspresi pembuatan array yang diketik secara implisit". Yang kedua adalah "ekspresi penciptaan objek anonim". Anda tidak mencantumkan dua sintaksis serupa lainnya; mereka adalah "penginisialisasi objek" dan "penginisialisasi koleksi".
Eric Lippert
11
Tidak persis C # "sintaks", tapi jangan lupa (favorit pribadi saya) Array.CreateInstance(typeof(int), 3)!
Jeffrey L Whitledge
17
@ Jeffrey: Jika kita menyusuri jalan itu, itu mulai konyol. Misalnya "1,2,3,4".split(','),.
Brian
11
Kemudian untuk array multi-dimensi, terdapat "bersarang" notasi seperti new int[,] { { 3, 7 }, { 103, 107 }, { 10003, 10007 }, };, dan seterusnya untuk int[,,], int[,,,], ...
Jeppe Stig Nielsen
6
@ Learning-Overthinker-Confused: Anda memiliki dua kuda. Anda ingin tahu mana yang lebih cepat. Apakah Anda (1) membalap kuda, atau (2) bertanya pada orang asing di internet yang belum pernah melihat kuda mana yang menurutnya lebih cepat? Balap kudamu . Anda ingin tahu mana yang lebih "efisien"? Pertama buat standar terukur untuk efisiensi; ingat, efisiensi adalah nilai yang dihasilkan per unit biaya , jadi tentukan nilai dan biaya Anda dengan cermat. Kemudian, tulis kode dengan kedua cara dan ukur efisiensinya. Gunakan sains untuk menjawab pertanyaan ilmiah, bukan untuk menebak secara acak.
Eric Lippert
111

Array tidak kosong

  • var data0 = new int[3]

  • var data1 = new int[3] { 1, 2, 3 }

  • var data2 = new int[] { 1, 2, 3 }

  • var data3 = new[] { 1, 2, 3 }

  • var data4 = { 1, 2, 3 }tidak dapat dikompilasi. Gunakan int[] data5 = { 1, 2, 3 }sebagai gantinya.

Array kosong

  • var data6 = new int[0]
  • var data7 = new int[] { }
  • var data8 = new [] { } dan int[] data9 = new [] { }tidak bisa dikompilasi.

  • var data10 = { }tidak dapat dikompilasi. Gunakan int[] data11 = { } sebagai gantinya.

Sebagai argumen dari suatu metode

Hanya ekspresi yang dapat ditetapkan dengan varkata kunci yang dapat dilewatkan sebagai argumen.

  • Foo(new int[2])
  • Foo(new int[2] { 1, 2 })
  • Foo(new int[] { 1, 2 })
  • Foo(new[] { 1, 2 })
  • Foo({ 1, 2 }) tidak dapat dikompilasi
  • Foo(new int[0])
  • Foo(new int[] { })
  • Foo({}) tidak dapat dikompilasi
cium ketiakku
sumber
14
Sebaiknya lebih jelas memisahkan sintaks yang tidak valid dari yang valid.
jpmc26
Apakah contoh yang diberikan lengkap? Apakah ada kasus lain?
Programmer Berorientasi Uang
49
Enumerable.Repeat(String.Empty, count).ToArray()

Akan membuat array string kosong yang diulang 'hitung' kali. Jika Anda ingin menginisialisasi array dengan nilai elemen default yang sama namun khusus. Hati-hati dengan tipe referensi, semua elemen akan merujuk objek yang sama.

Atomosk
sumber
5
Ya, var arr1 = Enumerable.Repeat(new object(), 10).ToArray();Anda mendapatkan 10 referensi ke objek yang sama. Untuk membuat 10 objek berbeda, Anda bisa menggunakan var arr2 = Enumerable.Repeat(/* dummy: */ false, 10).Select(x => new object()).ToArray();atau serupa.
Jeppe Stig Nielsen
20
var contacts = new[]
{
    new 
    {
        Name = " Eugene Zabokritski",
        PhoneNumbers = new[] { "206-555-0108", "425-555-0001" }
    },
    new 
    {
        Name = " Hanying Feng",
        PhoneNumbers = new[] { "650-555-0199" }
    }
};
Nahid Camalli
sumber
Bagaimana Anda seharusnya menggunakan struktur ini? Apakah ini seperti kamus?
R. Navega
1
@ R.Navega itu array biasa :)
grooveplex
17

Jika Anda ingin menginisialisasi array tetap elemen yang sama dengan inisialisasi (non- nullatau selain default), gunakan ini:

var array = Enumerable.Repeat(string.Empty, 37).ToArray();

Juga silakan ambil bagian dalam diskusi ini .

Shimmy Weitzhandler
sumber
13

Contoh untuk membuat larik kelas kustom

Di bawah ini adalah definisi kelas.

public class DummyUser
{
    public string email { get; set; }
    public string language { get; set; }
}

Ini adalah bagaimana Anda dapat menginisialisasi array:

private DummyUser[] arrDummyUser = new DummyUser[]
{
    new DummyUser{
       email = "[email protected]",
       language = "English"
    },
    new DummyUser{
       email = "[email protected]",
       language = "Spanish"
    }
};
Amol
sumber
7

Ulangi tanpa LINQ :

float[] floats = System.Array.ConvertAll(new float[16], v => 1.0f);
Nick Shalimov
sumber
6
int[] array = new int[4]; 
array[0] = 10;
array[1] = 20;
array[2] = 30;

atau

string[] week = new string[] {"Sunday","Monday","Tuesday"};

atau

string[] array = { "Sunday" , "Monday" };

dan dalam array multi dimensi

    Dim i, j As Integer
    Dim strArr(1, 2) As String

    strArr(0, 0) = "First (0,0)"
    strArr(0, 1) = "Second (0,1)"

    strArr(1, 0) = "Third (1,0)"
    strArr(1, 1) = "Fourth (1,1)"
Brad Larson
sumber
5
Hai, blok contoh terakhir tampaknya Visual Basic, pertanyaannya menanyakan contoh c #.
Alex KeySmith
4
For Class initialization:
var page1 = new Class1();
var page2 = new Class2();
var pages = new UIViewController[] { page1, page2 };
Sanjay Shrivastava
sumber
2

Cara lain untuk membuat dan menginisialisasi array objek. Ini mirip dengan contoh yang @Amol telah diposting di atas , kecuali yang ini menggunakan konstruktor. Sedikit polimorfisme muncul, aku tidak tahan.

IUser[] userArray = new IUser[]
{
    new DummyUser("[email protected]", "Gibberish"),
    new SmartyUser("[email protected]", "Italian", "Engineer")
};

Kelas untuk konteks:

interface IUser
{
    string EMail { get; }       // immutable, so get only an no set
    string Language { get; }
}

public class DummyUser : IUser
{
    public DummyUser(string email, string language)
    {
        m_email = email;
        m_language = language;
    }

    private string m_email;
    public string EMail
    {
        get { return m_email; }
    }

    private string m_language;
    public string Language
    {
        get { return m_language; }
    }
}

public class SmartyUser : IUser
{
    public SmartyUser(string email, string language, string occupation)
    {
        m_email = email;
        m_language = language;
        m_occupation = occupation;
    }

    private string m_email;
    public string EMail
    {
        get { return m_email; }
    }

    private string m_language;
    public string Language
    {
        get { return m_language; }
    }

    private string m_occupation;
}
Nick Alexeev
sumber
1

Untuk kelas di bawah ini:

public class Page
{

    private string data;

    public Page()
    {
    }

    public Page(string data)
    {
        this.Data = data;
    }

    public string Data
    {
        get
        {
            return this.data;
        }
        set
        {
            this.data = value;
        }
    }
}

Anda dapat menginisialisasi array dari objek di atas seperti di bawah ini.

Pages = new Page[] { new Page("a string") };

Semoga ini membantu.

sore
sumber
0

Anda juga dapat membuat array dinamis, yaitu pertama-tama Anda dapat menanyakan ukuran array dari pengguna sebelum membuatnya.

Console.Write("Enter size of array");
int n = Convert.ToInt16(Console.ReadLine());

int[] dynamicSizedArray= new int[n]; // Here we have created an array of size n
Console.WriteLine("Input Elements");
for(int i=0;i<n;i++)
{
     dynamicSizedArray[i] = Convert.ToInt32(Console.ReadLine());
}

Console.WriteLine("Elements of array are :");
foreach (int i in dynamicSizedArray)
{
    Console.WriteLine(i);
}
Console.ReadKey();
Pushpendra7974
sumber
0

Solusi sepele dengan ekspresi. Perhatikan bahwa dengan NewArrayInit Anda dapat membuat array satu dimensi saja.

NewArrayExpression expr = Expression.NewArrayInit(typeof(int), new[] { Expression.Constant(2), Expression.Constant(3) });
int[] array = Expression.Lambda<Func<int[]>>(expr).Compile()(); // compile and call callback
unsafePtr
sumber
0

Hanya sebuah catatan

Array berikut:

string[] array = new string[2];
string[] array2 = new string[] { "A", "B" };
string[] array3 = { "A" , "B" };
string[] array4 = new[] { "A", "B" };

Akan dikompilasi ke:

string[] array = new string[2];
string[] array2 = new string[]
{
   "A",
   "B"
};
string[] array3 = new string[]
{
   "A",
   "B"
};
string[] array4 = new string[]
{
   "A",
   "B"
};
Yousha Aleayoub
sumber