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

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

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

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

多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

Q&A

解決済

3回答

1055閲覧

C# 二次元配列について

big_D

総合スコア7

C#

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

多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

0グッド

0クリップ

投稿2021/02/02 13:24

現在、C#の基礎を学んでおり二次元配列のチャプターに入り勉強している段階で、
理解できない部分があり質問させていただきます。

C#

1string[][] teams = { 2 new string[] {"勇者","戦士","魔法使い"}, 3 new string[] {"盗賊","忍者","商人"}, 4 new string[] {"スライム","ドラゴン","魔王"}, 5 new string[] {"踊り子","僧侶","アーチャー"}, 6 }; 7 8 foreach(string[] team in teams) 9 { 10 foreach(string player in team) 11 { 12 Console.Write(player + " "); 13 } 14 Console.WriteLine(); 15 }

上記のコードは、二次元配列をループ処理するというコードになっております。
今回私が理解できていない部分としては、下記の項目です。

C#

1foreach(string player in team)

foreach(string[] team in teams) この部分では、
二次元配列を一元配列に変換しているという事は分かっているのですが、
その次の処理として、playerという名前のstring型に、
一次元配列に戻したteamという配列が入っているという理解で合っていますでしょうか。

お答えいただければ幸いです。

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

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

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

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

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

hoshi-takanori

2021/02/02 23:30

string[][] teams というのは、本物の 2 次元配列ではなく、ジャグ配列ですね。ジャグ配列は配列の配列なので、最初に foreach(string[] team in teams) でジャグ配列の要素である 1 次元配列を team として取り出し、次に foreach(string player in team) で team の各要素である player を取り出すことになります。 https://www.wareko.jp/blog/c-sharp-jagged-array-perfect-master https://www.atmarkit.co.jp/ait/spv/1701/10/news021.html
YAmaGNZ

2021/02/03 02:31

怖いのはこれをpaizaで2次元配列として解説しているところですかね paizaにある参考URLには全部「ジャグ配列」、「配列の配列」といった感じで紹介されているのに・・・
big_D

2021/02/03 02:37

ご返信いただきありがとうございます。 ジャグ配列について初めて聞きました。 二次元配列とジャグ配列の違いを完全理解はできていないのですが、 今回のコードの全体的な動きは理解することが出来ました。 ありがとうございます!
big_D

2021/02/03 02:47

そうですよね、、私も今回皆さんに教えて頂いてお陰で ジャグ配列の存在を知ったため、初めはこれを完全に二次元配列として覚えてしまっていました。
guest

回答3

0

ベストアンサー

二次元配列を一元配列に変換

foreachを勘違いなさっていると思われます。

foreach(string[] team in teams)

まずここですが、一次元に変換ではなく、
「1行分のデータをteamに取り出しながら処理しますよ」
ということです。
具体的に言うと、foreachによるループにて
以下の順番でteamに取り出しているだけです。

①team:{"勇者","戦士","魔法使い"},
②team:{"盗賊","忍者","商人"},
③team:{"スライム","ドラゴン","魔王"},
④team:{"踊り子","僧侶","アーチャー"},

次に

foreach(string player in team)

の部分ですが、
teamには、前述の①~④が入っていますので、
①回目のteamのループ時には、
具体的に以下となります。

①-1:player:勇者
①-2:player:戦士
①-3:player:魔法使い

②~④時も同様です。

投稿2021/02/02 15:46

編集2021/02/02 16:06
WhiteTempest

総合スコア404

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

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

big_D

2021/02/02 16:35

ご返信いただきありがとうございます。 何となく全体像を理解することが出来ました。 二元配列に入っている、  new string[] {"勇者","戦士","魔法使い"},  new string[] {"盗賊","忍者","商人"},  new string[] {"スライム","ドラゴン","魔王"},  new string[] {"踊り子","僧侶","アーチャー"}, これらを、foreachによるループ処理で一行ずつteamに取り出す。 team① {"勇者","戦士","魔法使い"}, team② {"盗賊","忍者","商人"}, team③ {"スライム","ドラゴン","魔王"}, team④ {"踊り子","僧侶","アーチャー"}, そして、さらにforeachによるループ処理で、stringデータ型 playerに、 一行ずつ処理されながら取り出されている。 player ①,1 : 勇者 ①,2 : 戦士 ①,3 : 魔法使い このような理解で間違いないでしょうか。
guest

0

・外側のforeachで二次元配列から内部に含まれる一次元配列をひとつずつ取り出してループしている。
・内側のforeachで↑で取り出した一次元配列から内部に含まれる要素(string)をひとつずつ取り出してループしている。

だけです。

投稿2021/02/02 14:57

gentaro

総合スコア8947

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

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

big_D

2021/02/03 02:40

ご返信いただきありがとうございます。 何となく全体的な動きは理解することが出来ました。 二元配列から一次元配列を一つずつ取り出すという工程を理解できていなかったようで、 今回で理解することが出来ました。 ありがとうございます!
guest

0

foreach(string[] team in teams) この部分では、

二次元配列を一元配列に変換しているという事は分かっているのですが、

配列の内容を順番に、その要素を取り出してます
(stringの配列の)配列の内容を順番に、その(stringの配列の)要素を取り出してます

その次の処理として、playerという名前のstring型に、

一次元配列に戻したteamという配列が入っているという理解で合っていますでしょうか。

(stringの)配列の内容を順番に、その(stringの)要素を取り出してます

投稿2021/02/02 13:31

編集2021/02/02 13:32
y_waiwai

総合スコア88042

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

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

big_D

2021/02/02 14:10

ご返信いただきありがとうございます。 重ねての質問で申し訳ないのですが、 二次元配列を一元配列に変換した結果、 その一元配列の中にはどのような順番で格納されているのでしょうか。 string[][] array = { new string[] {"勇者", "忍者"}, new string[] {"武士", "戦士"}, new string[] {"僧侶", "魔法使い"} }; foreach(string[] team in array){ Console.Write(team[0] + " "); }               この場合出力結果が、勇者、武士、僧侶になります。 また、下記のようにすると、 foreach(string[] team in array){ Console.WriteLine(team[0][0] + " "); }                 出力結果は、勇 武 僧 このようになります。 二次元配列を一元配列に変換する際には、 new string[] {"勇者", "忍者"} こういった配列に入った文字列を、 一つ一つ分けて("勇者" → 勇 と 者  のように)格納されているという事なのでしょうか。 コメントに対して、長文でのご質問申し訳ございません。 ご返信いただければ幸いです。
y_waiwai

2021/02/02 14:17

配列の最初から順番に取り出されます team[0] 配列の最初の文字列 team[0][0] 配列の最初の文字列、の最初の文字 がでてきます 文字列も、文字が並んだもんですね >二次元配列を一元配列に変換する際には、 変換はしてません 一個づつとってきてるだけです
big_D

2021/02/03 02:41

ご返信いただきありがとうございます。 二次元配列を一次元配列に取り出すという工程を理解できていませんでした。 今回で理解することが出来ました。 ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問