質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

3回答

21585閲覧

簡潔に2次元配列を作成したい。

退会済みユーザー

退会済みユーザー

総合スコア0

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2016/11/19 12:23

###前提・実現したいこと

要素の中身はまだ格納しないで、要素数だけ確保して2次元配列を作成したいと考えています。
例として、5つの行と6つの列から成る2次元配列を作成したいと考えています。

また、objarr[0].Lengthのように、1次元目の要素番号を指定して、その2次元目の配列の長さを取得できたり、
objarr[0][0]のように要素番号を指定して要素を取得できるようにしたいと考えています。

下記のコードで、その要件を満たすものはできたのですが、コードのコメントにも書いたように、
同じ長さの2次元目の配列を作成する場合でも、いちいち1次元目の要素番号を指定して、
それに対応した2次元目の配列を作成しなくてはならないのでしょうか?
ループは使わず、簡潔な書き方はありませんか?

C#

1 //5つの行と6つの列から成る2次元配列の作成する。 2 int[][] objarr = new int[5][]; 3 //ループを使わず、下記5行分をまとめて宣言できないか? 4 objarr[0] = new int[6]; 5 objarr[1] = new int[6]; 6 objarr[2] = new int[6]; 7 objarr[3] = new int[6]; 8 objarr[4] = new int[6]; 9 10 Debug.Log (objarr.Length); //5 11 Debug.Log (objarr[0].Length); //6 12 Debug.Log (objarr[0][0]); //0

理想としては、下記のようなコードで簡潔に作成したいのですが、このコードでは何故かエラーが起きてしまいます。
エラーの原因もよくわかりません。

C#

1//5つの行と6つの列から成る2次元配列の作成する。 2int[][] objarr = new int[5][6];
error CS0178: Invalid rank specifier: expected `,' or `]'

ご教授のほどよろしくお願いします。

###試したこと

下記のような書き方で、5つの行と6つの列から成る2次元配列の作成はできましたが、
この書き方だと何故か、objarr[0].Lengthのように、1次元目の要素番号を指定して、
その2次元目の配列の長さを取得したり、
objarr[0][0]のように要素番号を指定して要素を取得したりすることができません。

C#

1 //5つの行と6つの列から成る2次元配列の作成。 2 int[,] objarr = new int[5, 6]; 3 4 //下記のような書き方をすれば、 5 //1次元目や2次元目の配列の長さを取得できるが、 6 //objarr[0].Lengthのように、1次元目の要素番号を指定して、 7 //その2次元目の配列の長さを指定したい。 8 //あと、objarr[0][0]のように要素にアクセスしたい。 9 Debug.Log(objarr.GetLength(0)); //5 10 Debug.Log(objarr.GetLength(1)); //6 11 12 //Debug.Log (objarr[0].Length); //←何故かエラー。 13 //※行と列を指定してアクセスできない。 14 //Debug.Log (objarr[0][0]); //←何故かエラー。
error CS0178: Invalid rank specifier: expected `,' or `]' error CS0022: Wrong number of indexes `1' inside [], expected `2'

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

多次元配列のアクセスの場合は、

csharp

1 int data = objarr[0,0];

という形になります。

objarr[0].Length がエラーになる理由ですが、そもそも Length の意味をはき違えています。
Array.Length は「配列全体の要素数」を表すのですから、objarr[0].Length などという書き方ができないのは当然です。

最初にトライされたのは多次元配列ではなくジャグ配列です。これは「配列の配列」なので、objarr[0] は配列を表しているから objarr[0][0](=(objarr[0])[0]))や、objarr[0].Length といった書き方が可能なのです。

投稿2016/11/19 12:40

tacsheaven

総合スコア13703

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2016/11/19 13:08

ご回答ありがとうございます。 多次元配列とジャグ配列の違いがわかっていなかったので、勉強になりました。 ご教授くださりありがとうございます。
guest

0

こういうことでしょうか。

C#

1var objarr = new int[5][] { new int[6], new int[6], new int[6], new int[6], new int[6] };

投稿2016/11/19 12:33

twyujiro15

総合スコア217

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2016/11/19 13:06

ご回答ありがとうございます。 なるほど、横一列に書くやり方があるのですね。 ご教授くださりありがとうございます。
guest

0

こんにちは。

多次元配列とジャグ配列の両方を一緒くたにされているようです。
.NET の多次元配列とジャグ配列の解説が分かり易いと思います。

int[][] objarr = new int[5][6];

ジャグ配列ではできないです。
LINQを使えばワンライナーできるかも?(私はLINQはあまり詳しくないので、良く分かりません。ごめんなさい。)

投稿2016/11/19 12:32

Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2016/11/19 13:06

ご回答ありがとうございます。 仰る通り、多次元配列とジャグ配列の違いがわかっていませんでした。 int[][] objarr = new int[5][6]; は、ジャグ配列ではできないのですね。 ご教授くださりありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問