92198


標題のとおりです。  
例えばPHPでは下記のように変数の宣言と初期化を同時に行えます。

[code]

    $arr = [
      "arr1" => [
        "val1", "val2", "val3"
      ],
      "arr2" => [
        "val4", "val5"
      ],
      "arr3" => [
        "val6", "val7"
      ],
    ];
    
[/code]

配列要素をネストしていけば理論上は無限に多次元配列を宣言しながら初期化が可能です。  
同様にC#で多次元配列を宣言しながら初期化する方法を教えてください。


CC BY-SA 4.0
2022-11-13T05:59:55.883
92197
2022-11-13T07:42:28.303
49296
question
c# array
C#における多次元配列を宣言しながら初期化する方法を教えてください


質問の書き方は厳密には`多次元配列`というよりは`連想配列`(多次元の?)ではありませんか？  
[PHP 連想配列と多次元配列のサンプル](https://itsakura.com/php-as-array)

キー(`arrX`)と値の配列(`valY`...)をさらに配列にしているようですね。  
しかも値の配列の中の個数は任意のようです。

C#で値だけなら簡単に多次元配列を定義して初期化出来ます。(例は`int`の配列ですが)  
[多次元配列 (C# プログラミング ガイド)](https://learn.microsoft.com/ja-
jp/dotnet/csharp/programming-guide/arrays/multidimensional-arrays)

それから要素の個数が同一で無い物はジャグ配列という名で少し違う方法で初期化します。  
[ジャグ配列 (C# プログラミング ガイド)](https://learn.microsoft.com/ja-
jp/dotnet/csharp/programming-guide/arrays/jagged-arrays)  
例えば質問の例に近づけるとこんな風になります。(キーの指定は出来ません)

[code]

    string[][] arr = {
        new string[] { "val1", "val2", "val3" },
        new string[] { "val4", "val5" },
        new string[] { "val6", "val7" }
    };
    
[/code]

しかし連想配列に近づけたいならC#ではDictionary型を使うことになるでしょう。  
[C#で連想配列を使う方法](http://white-bear.info/archives/1625)  
[【C#】Dictionaryの使い方（連想配列の使用方法まとめ）](https://marunaka-blog.com/c-sharp-
dictionary/5396/)

以下のような形になるでしょう。

[code]

    Dictionary<string, string[]> arr = new Dictionary<string, string[]>()
    {
        {"arr1", new string[] {"val1", "val2" , "val3" } },
        {"arr2", new string[] {"val4", "val5" } },
        {"arr3", new string[] {"val6", "val7" } }
    };
    
[/code]

あるいは値の配列の部分はListにしても良いでしょう。

[code]

    Dictionary<string, List<string>> arr = new Dictionary<string, List<string>>()
    {
        {"arr1", new List<string>{"val1", "val2" , "val3" } },
        {"arr2", new List<string>{"val4", "val5" } },
        {"arr3", new List<string>{"val6", "val7" } }
    };
    
[/code]


CC BY-SA 4.0
2022-11-13T07:03:35.807
92198
2022-11-13T07:03:35.807
26370
92197
answer


kunifさんの回答の他に[`Lookup`クラス](https://learn.microsoft.com/ja-
jp/dotnet/api/system.linq.lookup-2?view=net-7.0)も用意されています。ただしこちらはコンストラクタが提供されていないため、宣言しながら初期化はできません。[`ToLookup()`拡張メソッド](https://learn.microsoft.com/ja-
jp/dotnet/api/system.linq.enumerable.tolookup?view=net-7.0)で構築することができます。

[code]

    using static System.Collections.Generic.KeyValuePair;
    var arr = new[] {
        Create("arr1", "val1"),
        Create("arr1", "val2"),
        Create("arr1", "val3"),
        Create("arr2", "val4"),
        Create("arr2", "val5"),
        Create("arr3", "val6"),
        Create("arr3", "val7"),
    }.ToLookup(p => p.Key, p => p.Value);
    
[/code]


CC BY-SA 4.0
2022-11-13T07:42:28.303
92201
2022-11-13T07:42:28.303
4236
92197
answer