Tüm olası dizi başlatma sözdizimleri


Yanıtlar:


779

Bunlar basit bir dizi için geçerli bildirim ve başlatma yöntemleridir.

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

Linq ToArray()uzantıları gibi dizileri elde etmek için başka tekniklerin bulunduğunu unutmayın IEnumerable<T>.

Yukarıdaki açıklamalarda , sağdaki bilgiler uygun türü çıkarmak için yeterli olduğundan , ilk ikisinin string[]soldaki var(C # 3+) ile değiştirebileceğini unutmayın . Derleyici başlatma sözdizimi tek başına derleyicinin taleplerini karşılamak için yeterli olmadığından, üçüncü satır görüntülenen şekilde yazılmalıdır. Dördüncüsü de çıkarsama kullanabilir. Yani eğer bütün kıskançlık içindeyseniz, yukarıdaki gibi yazılabilir

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 

1
Merak edip, birisi 3. satırdaki başlatma ifadesinin neden tek başına kullanılamayacağını (örneğin bir yönteme geçildi) veya bir vardeğişkene atanamayacağını açıklayabilir mi?
Ruben9922

1
@ Ruben9922: İlginç bir soru. Bu mantıklıdır var x = {}işi yapmazsa diziler daha başka bir şey elde olabilir, ama bunun ne olduğunu olmazdı başlatıcısı dizi. Yani dizi başlatıcı bir dil özelliği sanırım. Bununla birlikte kullanırsanız new List<string> {"A", "B"}, farklı bir şey verir.
TvdH

443

C # ifadeleri olan dizi oluşturma sözdizimleri şunlardır:

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

İlkinde, boyut herhangi bir negatif olmayan integral değeri olabilir ve dizi elemanları varsayılan değerlere sıfırlanır.

İkincisinde, boyut sabit olmalı ve verilen eleman sayısı eşleşmelidir. Belirli öğelerden belirli dizi öğesi türüne örtük bir dönüşüm olmalıdır.

Üçüncüsünde, elemanlar dolaylı olarak eleman tipine dönüştürülebilir olmalıdır ve boyut verilen elemanların sayısından belirlenir.

Dördüncüsünde dizi öğesinin türü, türlere sahip verilen tüm öğelerin en iyi türünün (varsa) hesaplanmasıyla çıkarılır. Tüm öğeler örtük olarak bu türe dönüştürülebilir olmalıdır. Boyut verilen elemanların sayısından belirlenir. Bu sözdizimi C # 3.0'da tanıtıldı.

Ayrıca yalnızca bir bildirimde kullanılabilecek bir sözdizimi de vardır:

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

Öğeler, öğe türüne dolaylı olarak dönüştürülebilir olmalıdır. Boyut verilen elemanların sayısından belirlenir.

hepsi bir arada kılavuz yok

Sizi C # 4.0 belirtimi, bölüm 7.6.10.4 "Dizi Oluşturma İfadeleri" ne atıfta bulunuyorum.


8
@BoltClock: Bahsettiğiniz ilk sözdizimi "örtük olarak yazılan bir dizi oluşturma ifadesidir". İkincisi, "anonim bir nesne yaratma ifadesidir". Diğer iki benzer sözdizimini listelemezsiniz; "nesne başlatıcı" ve "koleksiyon başlatıcı" dır.
Eric Lippert

11
Tam olarak C # "sözdizimi" değil, ama (kişisel favorim) unutmayalım Array.CreateInstance(typeof(int), 3)!
Jeffrey L Whitledge

17
@Jeffrey: Eğer o yoldan gidersek, aptallaşmaya başlar. Ör "1,2,3,4".split(',').
Brian

11
Sonra çok boyutlu diziler için orada var "iç içe" gösterimler gibi new int[,] { { 3, 7 }, { 103, 107 }, { 10003, 10007 }, };ve benzeri için üzerinde int[,,], int[,,,]...
Jeppe Stig Nielsen

6
@ Learning-Overthinker-Confused: İki atın var. Hangisinin daha hızlı olduğunu bilmek istersiniz. (1) atlarla yarışıyor musunuz veya (2) internette atları daha önce hiç görmediğini hiç görmemiş bir yabancıya soruyor musunuz? Atlarınla ​​yarış . Hangisinin daha "verimli" olduğunu bilmek ister misiniz? Önce verimlilik için ölçülebilir bir standart oluşturun; Unutmayın, verimlilik birim maliyet başına üretilen değerdir , bu nedenle değerinizi ve maliyetinizi dikkatlice tanımlayın. Ardından kodu her iki şekilde de yazın ve etkinliğini ölçün. Bilimsel soruları yanıtlamak için bilimi kullanın, tahminler için rastgele yabancılara sormayın.
Eric Lippert

111

Boş olmayan diziler

  • 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 }derlenemez. int[] data5 = { 1, 2, 3 }Bunun yerine kullanın .

Boş diziler

  • var data6 = new int[0]
  • var data7 = new int[] { }
  • var data8 = new [] { } ve int[] data9 = new [] { }derlenemez.

  • var data10 = { }derlenemez. int[] data11 = { } Bunun yerine kullanın .

Bir yöntemin argümanı olarak

Yalnızca varanahtar kelimeyle atanabilecek ifadeler bağımsız değişken olarak geçirilebilir.

  • Foo(new int[2])
  • Foo(new int[2] { 1, 2 })
  • Foo(new int[] { 1, 2 })
  • Foo(new[] { 1, 2 })
  • Foo({ 1, 2 }) derlenemez
  • Foo(new int[0])
  • Foo(new int[] { })
  • Foo({}) derlenemez

14
Geçersiz sözdizimlerini geçerli olanlardan daha açık bir şekilde ayırmak iyi olur.
jpmc26

Verilen örnekler eksiksiz mi? Başka dava var mı?
Para Odaklı Programcı

49
Enumerable.Repeat(String.Empty, count).ToArray()

Boş dizeler dizisi oluşturacak 'sayım' kez tekrarlanır. Aynı henüz özel varsayılan öğe değerine sahip diziyi başlatmak istiyorsanız. Referans türlerine dikkat edin, tüm elemanlar aynı nesneyi ifade edecektir.


5
Evet, var arr1 = Enumerable.Repeat(new object(), 10).ToArray();aynı nesneye 10 referans alırsınız. 10 farklı nesne oluşturmak için var arr2 = Enumerable.Repeat(/* dummy: */ false, 10).Select(x => new object()).ToArray();veya benzerlerini kullanabilirsiniz .
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" }
    }
};

Bu yapıyı nasıl kullanmanız gerekiyor? Sözlük gibi mi?
R. Navega

1
@ R.Navega sıradan bir dizi :)
grooveplex

17

Önceden başlatılmış eşit (olmayan nullveya olmayan default) öğelerin sabit bir dizisini başlatmak istiyorsanız , bunu kullanın:

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

Ayrıca lütfen bu tartışmaya katılın.


13

Özel sınıftan bir dizi oluşturma örneği

Sınıf tanımı aşağıdadır.

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

Diziyi şu şekilde başlatabilirsiniz:

private DummyUser[] arrDummyUser = new DummyUser[]
{
    new DummyUser{
       email = "abc.xyz@email.com",
       language = "English"
    },
    new DummyUser{
       email = "def@email.com",
       language = "Spanish"
    }
};


6
int[] array = new int[4]; 
array[0] = 10;
array[1] = 20;
array[2] = 30;

veya

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

veya

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

ve çok boyutlu dizide

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

5
Merhaba, örneklerin son bloğu Visual Basic gibi görünüyor, soru c # örnekleri istiyor.
Alex KeySmith

4
For Class initialization:
var page1 = new Class1();
var page2 = new Class2();
var pages = new UIViewController[] { page1, page2 };

2

Bir nesne dizisi oluşturmanın ve başlatmanın başka bir yolu. Bu, @Amol'un yukarıda yayınladığı örneğe benzer , ancak bunun dışında yapıcılar kullanılır. Bir dizi polimorfizm serpildi, dayanamadım.

IUser[] userArray = new IUser[]
{
    new DummyUser("abc@cde.edu", "Gibberish"),
    new SmartyUser("pga@lna.it", "Italian", "Engineer")
};

Bağlam için sınıflar:

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

1

Aşağıdaki sınıf için:

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

yukarıdaki nesnenin dizisini aşağıdaki gibi başlatabilirsiniz.

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

Bu yardımcı olur umarım.


0

Dinamik diziler de oluşturabilirsiniz, yani diziyi oluşturmadan önce kullanıcıdan boyutunu sorabilirsiniz.

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

0

İfadelerle önemsiz çözüm. NewArrayInit ile yalnızca tek boyutlu bir dizi oluşturabileceğinizi unutmayın.

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

0

Sadece bir not

Aşağıdaki diziler:

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

Olacak derlenmiş için:

string[] array = new string[2];
string[] array2 = new string[]
{
   "A",
   "B"
};
string[] array3 = new string[]
{
   "A",
   "B"
};
string[] array4 = new string[]
{
   "A",
   "B"
};
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.