C # ile mümkün olan tüm dizi başlatma sözdizimleri nelerdir?
C # ile mümkün olan tüm dizi başlatma sözdizimleri nelerdir?
Yanıtlar:
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
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.
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.
Array.CreateInstance(typeof(int), 3)
!
"1,2,3,4".split(',')
.
new int[,] { { 3, 7 }, { 103, 107 }, { 10003, 10007 }, };
ve benzeri için üzerinde int[,,]
, int[,,,]
...
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 .
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 .
Yalnızca var
anahtar 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({})
derlenemezEnumerable.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.
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 .
var contacts = new[]
{
new
{
Name = " Eugene Zabokritski",
PhoneNumbers = new[] { "206-555-0108", "425-555-0001" }
},
new
{
Name = " Hanying Feng",
PhoneNumbers = new[] { "650-555-0199" }
}
};
Önceden başlatılmış eşit (olmayan null
veya 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.
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"
}
};
LINQ olmadan tekrarlayın :
float[] floats = System.Array.ConvertAll(new float[16], v => 1.0f);
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)"
For Class initialization:
var page1 = new Class1();
var page2 = new Class2();
var pages = new UIViewController[] { page1, page2 };
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;
}
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.
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();
İ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
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"
};
var
değişkene atanamayacağını açıklayabilir mi?