C#で可能なすべての配列初期化構文は何ですか?
C#で可能なすべての配列初期化構文は何ですか?
回答:
これらは、単純な配列の現在の宣言および初期化メソッドです。
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()
拡張など、配列を取得する他の手法が存在することに注意してくださいIEnumerable<T>
。
また、上記の宣言では、最初の2つstring[]
は左側のをvar
(C#3+)で置き換えることができることに注意してください。右側の情報で適切な型を推測できます。配列の初期化構文だけではコンパイラの要求を満たすには不十分であるため、3行目は表示どおりに記述する必要があります。4番目も推論を使用できます。したがって、全体を簡潔にする必要がある場合、上記は次のように書くことができます。
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 = {}
配列初期化子が配列よりも何かを生み出すことができれば仕事をしませんが、私はそれが何であるかを知ることはできません。したがって、配列初期化子は言語機能だと思います。それと一緒new List<string> {"A", "B"}
に使うと、また何か違うものになります。
式であるC#の配列作成構文は次のとおりです。
new int[3]
new int[3] { 10, 20, 30 }
new int[] { 10, 20, 30 }
new[] { 10, 20, 30 }
最初の例では、サイズは負でない任意の整数値にすることができ、配列要素はデフォルト値に初期化されます。
2番目のものでは、サイズは定数である必要があり、指定された要素の数は一致している必要があります。指定された要素から指定された配列要素タイプへの暗黙的な変換が必要です。
3番目のものでは、要素は暗黙的に要素タイプに変換可能でなければならず、サイズは指定された要素の数から決定されます。
4番目のものでは、配列要素のタイプは、タイプがあるすべての指定された要素の中で、もしあれば、最良のタイプを計算することによって推論されます。すべての要素は暗黙的にその型に変換可能でなければなりません。サイズは与えられた要素の数から決定されます。この構文はC#3.0で導入されました。
宣言でのみ使用できる構文もあります。
int[] x = { 10, 20, 30 };
要素は、暗黙的に要素タイプに変換できる必要があります。サイズは与えられた要素の数から決定されます。
オールインワンガイドはありません
C#4.0仕様のセクション7.6.10.4「配列作成式」を参照します。
Array.CreateInstance(typeof(int), 3)
!
"1,2,3,4".split(',')
。
new int[,] { { 3, 7 }, { 103, 107 }, { 10003, 10007 }, };
、などのために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 }
コンパイルできません。int[] data5 = { 1, 2, 3 }
代わりに使用してください。
var data6 = new int[0]
var data7 = new int[] { }
var data8 = new [] { }
そしてint[] data9 = new [] { }
コンパイルではありません。
var data10 = { }
コンパイルできません。int[] data11 = { }
代わりに使用してください。
var
引数として渡すことができるのは、キーワードで割り当てることができる式のみです。
Foo(new int[2])
Foo(new int[2] { 1, 2 })
Foo(new int[] { 1, 2 })
Foo(new[] { 1, 2 })
Foo({ 1, 2 })
コンパイルできません Foo(new int[0])
Foo(new int[] { })
Foo({})
コンパイルできませんEnumerable.Repeat(String.Empty, count).ToArray()
'count'回繰り返される空の文字列の配列を作成します。同じ特別なデフォルトの要素値で配列を初期化したい場合。参照タイプに注意すると、すべての要素が同じオブジェクトを参照します。
var arr1 = Enumerable.Repeat(new object(), 10).ToArray();
あなたは同じオブジェクトへの10の参照を取得します。10個の異なるオブジェクトを作成するには、var arr2 = Enumerable.Repeat(/* dummy: */ false, 10).Select(x => new object()).ToArray();
またはを使用できます。
var contacts = new[]
{
new
{
Name = " Eugene Zabokritski",
PhoneNumbers = new[] { "206-555-0108", "425-555-0001" }
},
new
{
Name = " Hanying Feng",
PhoneNumbers = new[] { "650-555-0199" }
}
};
事前に初期化された等しい(非null
または以外のdefault
)要素の固定配列を初期化する場合は、次のようにします。
var array = Enumerable.Repeat(string.Empty, 37).ToArray();
また、この議論に参加してください。
以下はクラス定義です。
public class DummyUser
{
public string email { get; set; }
public string language { get; set; }
}
これは、配列を初期化する方法です。
private DummyUser[] arrDummyUser = new DummyUser[]
{
new DummyUser{
email = "abc.xyz@email.com",
language = "English"
},
new DummyUser{
email = "def@email.com",
language = "Spanish"
}
};
int[] array = new int[4];
array[0] = 10;
array[1] = 20;
array[2] = 30;
または
string[] week = new string[] {"Sunday","Monday","Tuesday"};
または
string[] array = { "Sunday" , "Monday" };
そして多次元配列
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 };
オブジェクトの配列を作成および初期化する別の方法。これは、@ Amolが上記で投稿した例に似ていますが、コンストラクタを使用している点が異なります。ポリモーフィズムがちりばめられて、抵抗できませんでした。
IUser[] userArray = new IUser[]
{
new DummyUser("abc@cde.edu", "Gibberish"),
new SmartyUser("pga@lna.it", "Italian", "Engineer")
};
コンテキストのクラス:
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;
}
動的配列を作成することもできます。つまり、配列を作成する前に、ユーザーに配列のサイズを尋ねることができます。
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();
ただのメモ
次の配列:
string[] array = new string[2];
string[] array2 = new string[] { "A", "B" };
string[] array3 = { "A" , "B" };
string[] array4 = new[] { "A", "B" };
されますコンパイルします:
string[] array = new string[2];
string[] array2 = new string[]
{
"A",
"B"
};
string[] array3 = new string[]
{
"A",
"B"
};
string[] array4 = new string[]
{
"A",
"B"
};
var
変数に割り当てることができない理由を誰かが説明できますか?