C#で可能なすべての配列初期化構文は何ですか?
17 に答える
これらは、単純な配列の現在の宣言および初期化メソッドです。
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
ToArray()
のLinq拡張機能など、配列を取得する他の手法が存在することに注意してくださいIEnumerable<T>
。
また、上記の宣言では、右側の情報が適切なタイプを推測するのに十分であるため、最初の2つstring[]
は左側のを(C#3+)に置き換えることができることに注意してください。var
配列の初期化構文だけではコンパイラの要求を満たすのに十分ではないため、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
式である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「配列作成式」を参照してください。
空でない配列
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 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"
}
};
LINQなしで繰り返す:
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;
また
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)"
ただのメモ
次の配列:
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" };
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;
}
以下のクラスの場合:
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;
}
}
}
上記のオブジェクトの配列を以下のように初期化できます。
Pages = new Page[] { new Page("a string") };
お役に立てれば。
こんにちは、別の方法を追加するだけです:このページから: https ://docs.microsoft.com/it-it/dotnet/api/system.linq.enumerable.range?view = netcore-3.1
このフォームを使用できます。指定された範囲strat0〜9内の整数のシーケンスを生成する場合:
using System.Linq
.....
public int[] arrayName = Enumerable.Range(0, 9).ToArray();
空の配列を初期化するにはArray.Empty<T>()
、dotnet5.0にある必要があります
文字列の場合
var items = Array.Empty<string>();
番号について
var items = Array.Empty<int>();
動的配列を作成することもできます。つまり、作成する前に、まずユーザーに配列のサイズを尋ねることができます。
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();
式を使った簡単な解決策。NewArrayInitを使用すると、1次元配列のみを作成できることに注意してください。
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