可能なすべての配列初期化構文


回答:


779

これらは、単純な配列の現在の宣言および初期化メソッドです。

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 

1
好奇心から、3行目の初期化式を単独で使用できない(たとえば、メソッドに渡す)か、var変数に割り当てることができない理由を誰かが説明できますか?
Ruben9922

1
@ Ruben9922:興味深い質問。これは、意味になるだろうvar x = {}配列初期化子が配列よりも何かを生み出すことができれば仕事をしませんが、私はそれが何であるかを知ることはできません。したがって、配列初期化子は言語機能だと思います。それと一緒new List<string> {"A", "B"}に使うと、また何か違うものになります。
TvdH

441

である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「配列作成式」を参照します。


8
@BoltClock:最初に言及する構文は、「暗黙的に型指定された配列作成式」です。2つ目は「匿名オブジェクト作成式」です。他の2つの同様の構文はリストしません。「オブジェクト初期化子」と「コレクション初期化子」です。
Eric Lippert、2011

11
正確にはC#の「構文」ではありませんが、忘れないでください(私の個人的なお気に入り)Array.CreateInstance(typeof(int), 3)
ジェフリーLホイットレッジ

17
@ジェフリー:その道を進んでいると、ばかげてきます。例えば、"1,2,3,4".split(',')
ブライアン

11
次いで、多次元配列のため、のような「ネスト」表記が存在するnew int[,] { { 3, 7 }, { 103, 107 }, { 10003, 10007 }, };、などのためにint[,,]int[,,,]...
ジャップスティーグニールセン

6
@ Learning-Overthinker-Con混乱:あなたは2頭の馬を飼っています。あなたはどちらが速いか知りたいです。あなたは、(1)馬と競い合ったり、(2)インターネットで見たことのない見知らぬ人に、彼がより速いと思っている馬を尋ねたりしますか? あなたの馬を競います。あなたはどちらがより「効率的」か知りたいですか?最初に、効率の測定可能な基準を作成します。効率は単位コストあたりの価値であるので、価値とコストを慎重に定義してください。次に、両方の方法でコードを記述し、その効率を測定します。科学を使って科学的な質問に答え、ランダムな見知らぬ人に推測を求めないでください
エリックリッペルト2018年

111

空でない配列

  • 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({}) コンパイルできません

14
無効な構文と有効な構文をより明確に区別することをお勧めします。
jpmc26 2015年

与えられた例は完全ですか?他のケースはありますか?
お金指向のプログラマー

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

'count'回繰り返される空の文字列の配列を作成します。同じ特別なデフォルトの要素値で配列を初期化したい場合。参照タイプに注意すると、すべての要素が同じオブジェクトを参照します。


5
はい、var arr1 = Enumerable.Repeat(new object(), 10).ToArray();あなたは同じオブジェクトへの10の参照を取得します。10個の異なるオブジェクトを作成するには、var arr2 = Enumerable.Repeat(/* dummy: */ false, 10).Select(x => new object()).ToArray();またはを使用できます。
Jeppe Stig Nielsen 2014

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

この構造をどのように使用することになっていますか?辞書みたい?
R.ナベガ2018

1
@ R.Navegaそれは普通の配列です:)
GroovePlex

17

事前に初期化された等しい(非nullまたは以外のdefault)要素の固定配列を初期化する場合は、次のようにします。

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

また、この議論に参加してください。


13

カスタムクラスの配列を作成する例

以下はクラス定義です。

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


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

5
こんにちは、例の最後のブロックはVisual Basicのようです。質問ではc#の例を求めています。
Alex KeySmith、2015年


2

オブジェクトの配列を作成および初期化する別の方法。これは、@ 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;
}

1

以下のクラスの場合:

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

お役に立てれば。


0

動的配列を作成することもできます。つまり、配列を作成する前に、ユーザーに配列のサイズを尋ねることができます。

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

式を使用した簡単な解決策。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

0

ただのメモ

次の配列:

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"
};
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.