web-dev-qa-db-ja.com

考えられるすべての配列初期化構文

C#で可能なすべての配列初期化構文は何ですか?

606
Joshua Girard

これらは単純な配列に対する現在の宣言と初期化メソッドです。

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

IEnumerable<T>のLinq ToArray()拡張など、配列を取得するための他のテクニックが存在することに注意してください。

また、上記の宣言では、右側の情報が適切な型を推測するのに十分なので、最初の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 
637
Anthony Pegram

C#の配列作成構文は、 expressions です。

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「配列作成式」を参照してください。

410
Eric Lippert

空でない配列

  • 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({})はコンパイルできません
98
kiss my armpit
Enumerable.Repeat(String.Empty, count).ToArray()

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

43
Atomosk
var contacts = new[]
{
    new 
    {
        Name = " Eugene Zabokritski",
        PhoneNumbers = new[] { "206-555-0108", "425-555-0001" }
    },
    new 
    {
        Name = " Hanying Feng",
        PhoneNumbers = new[] { "650-555-0199" }
    }
};
17
Nahid Camalli

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

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

this にも参加してください。

14
Shimmy

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

以下はクラス定義です。

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

これが配列の初期化方法です。

private DummyUser[] arrDummyUser = new DummyUser[]
{
    new DummyUser{
       email = "[email protected]",
       language = "English"
    },
    new DummyUser{
       email = "[email protected]",
       language = "Spanish"
    }
};
12
Amol
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)"
6
user2613377

_ linq _ :なしで繰り返します。

float[] floats = System.Array.ConvertAll(new float[16], v => 1.0f);
6
Nick Shalimov
For Class initialization:
var page1 = new Class1();
var page2 = new Class2();
var pages = new UIViewController[] { page1, page2 };
3

オブジェクトの配列を作成して初期化するもう1つの方法。これは @Amolが上に投稿した例 に似ていますが、これはコンストラクタを使用する点が異なります。多型のダッシュが散りばめられて、私は抵抗することができませんでした。

IUser[] userArray = new IUser[]
{
    new DummyUser("[email protected]", "Gibberish"),
    new SmartyUser("[email protected]", "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;
}
2
Nick Alexeev

動的配列を作成することもできます。つまり、作成する前に、まず配列のサイズをユーザーに問い合わせることができます。

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
Pushpendra7974

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