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

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

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

foreachは、List・Collection・Arrayといったデータ構造の各要素に対して繰り返し処理を実行するために扱われる、制御構造の構文です。

if

if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

C#

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

Q&A

3回答

2138閲覧

foreach内と外の動作、if内のbreakについて

herumettokoala

総合スコア4

foreach

foreachは、List・Collection・Arrayといったデータ構造の各要素に対して繰り返し処理を実行するために扱われる、制御構造の構文です。

if

if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

C#

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

0グッド

0クリップ

投稿2019/10/06 19:09

編集2019/10/07 08:26

前提・実現したいこと

<ソースコードとして前提>
用意している配列において、同じ要素の数をカウントして、その数を出力したい。(5を出力)
<自分として実現したいこと>
ただこのコードの
var cnt = 0;の位置がどこにあるべきかの理由を知りたいだけです。

発生している問題・エラーメッセージ

自分では以下の様なコードを入力しました。     var cnt = 0;     foreach (var pattern in array) { foreach (var word in array) { if (pattern == word) { cnt++; } } 調べた結果、正解は      foreach (var pattern in array) { var cnt = 0; foreach (var word in array) { if (pattern == word) { cnt++; } } で、foreachの中に以上のようにvar cnt=0;を置くのが正解らしいが、foreachの中にvar cnt = 0;が入っているということは、毎回、var cnt = 0;が作られていませんか。foreachの中の状況がいまいちわかりません。外に置くとなぜ間違いかわからない。

該当のソースコード

C#

1//これは自分がうった間違いのソースコードです。 2using System; 3 4class paiza 5{ 6 static void Main() 7 { 8 string[] array = {"HND", "NRT", "KIX", "NGO", "NGO", "NGO", "NGO", "NGO"}; 9 var duplicate = 0; 10 11    var cnt = 0; 12 foreach (var pattern in array) 13 { 14 foreach (var word in array) 15 { 16 if (pattern == word) 17 { 18 cnt++; 19 } 20 } 21 22 23 duplicate = cnt; 24 25 26 } 27 28 Console.WriteLine(duplicate); 29 } 30} 31

試したこと

正解を調べたところ、発生している問題・エラーメッセージのようにするのが正解のようです。
また、duplicate = cnt;
break;
を、if (cnt != 1)
{
duplicate = cnt;
break;
}
とするそうです。

補足情報(FW/ツールのバージョンなど)

なお、このサイトでの質問が初めての為、マルチポストがダメなのを知らず、知恵袋の方に先に質問しています。知恵袋では心配でしたのでこちらにも質問しました。なお、知恵袋には正しいソースコードを、こちらでは自分が入力した間違いのソースコードを記入しています。知恵袋の方でも教えていただいているので、そちらの方もご参照下さい。https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q13214577238
また、こちらの問題はpaizaラーニングというこちらのサイトの
https://paiza.jp/works
レベルアップ問題集、Bランクレベルアップセット、C#編、文字と整数の組のソート2、STEP3の問題になります。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2019/10/06 21:25

質問文からは何が聞きたいのかが読めないのですが。
YAmaGNZ

2019/10/06 22:32

paizaの環境のみで学習されるのではなく、VisualStudio等のデバッガを使用できるものを利用して学習されることをお勧めします。
Zuishin

2019/10/07 08:08

深い……?
Zuishin

2019/10/07 08:14 編集

削除
herumettokoala

2019/10/07 08:29

そんなにひどいコードなんですね。 どのように編集すれば、ひどいコードから正せますでしょうか? よろしくお願い致します。
Zuishin

2019/10/07 08:32

いえ、私の勘違いです。標準入力からデータが与えられるのを配列に直す問題かと思ったので。もっとスマートな書き方はありますが、そこまでひどくはありません。
guest

回答3

0

var cnt = 0;の位置がどこにあるべきかの理由を知りたいだけです。

cntが何をカウントするものなのか考えてください。
それが分かれば、どこでcntをリセットすべきなのかが理解できるはずです。

質問へのコメントでも記載しましたが、paizaでは開発環境をインストールせずともコードの動作をブラウザ上で確認でき便利なのですが、ステップ実行や実行中の変数の中身の確認などデバッガーで出来ることが行えません。
ですので、VisualStudio等の開発環境をインストールし、デバッガーも使用できる環境を整えて学習することをお勧めします。

投稿2019/10/09 00:48

YAmaGNZ

総合スコア10242

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

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

0

前提。すみませんが他サイトは見てません。リンクになってないです。paizaはキモなんで見ようとしましたがログインが必要そうだったので見れません。

質問者様のコードが誤りで、そのコードが正解になるなら、問題の理解が間違っていないか確認することをおすすめしたいです。
質問者様のコードは、arrayには重複は必ず1パターンしかないなど特定の条件があれば正解であり得ると思います。
つまり、

csharp

1array = {"HND", "NRT", "NRT", "NGO", "NGO", "NGO", "NGO", "NGO"};

このようなパターンは出現しないことが保証されていれば問題ないと思います。
あるいはこういうパターンはあり得るが、ユニークでないもの(かぶりのあるもの)は何と重複していてもカウントする、という目的であれば問題ないと思います。

これを正解だと称する問題の制約を正しく把握できない限り、なぜ質問者様のコードが正しくないのか、もまた正しく説明できないです。

投稿2019/10/08 09:55

papinianus

総合スコア12705

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

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

Zuishin

2019/10/08 10:00

重複するものは一種類だけという制約がありました。
papinianus

2019/10/09 09:11 編集

ありがとうございます。 重複が一種類という制約なら最後にsqrtした結果を出せば良いように考えました。 が、おそらく私はケースの考慮が足りてないと思います。私ならこの問いはGroupByで解決する問いだと考えるので。
guest

0

まずは最初のforeach文にブレークポイントを設定しておいて、そこから変数のナカミを見ながら1行づつ実行していきましょう。
それでコードの動作がわかると思います。

それを一通りやって、なおもわからないところがあるというなら改めて聞きましょう

投稿2019/10/06 22:16

y_waiwai

総合スコア87749

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問