C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

c#のコレクション、ループについての質問

[トピック内 12 記事 (1 - 12 表示)]  << 0 >>

■100721 / inTopicNo.1)  c#のコレクション、ループについての質問
  
□投稿者/ しーや (1回)-(2022/10/22(Sat) 00:44:19)

分類:[.NET 全般] 

プログラミング初心者で、タイトル箇所を勉強中です。ローカル変数が途中で固定されて永遠に続いてしまいます。細かい説明はコードの後にします。


public class LearningCurve : MonoBehaviour
{
Dictionary<string, int> item = new Dictionary<string, int>()
{
{"bag",25},
{"wawawa",3},
{"dadada",10},
};

// Start is called before the first frame update
void Start()
{

}

// Update is called once per frame
void Update()
{
foreach (KeyValuePair <string ,int>kvp in item)
{
string buy = kvp.Key ;
switch (buy)
{
case "wawawa":
item["bag"] = item["bag"] - item ["wawawa"];
break;
case "dadada":
item["bag"] = item["bag"] - item["dadada"];
break;
default:
break;
}

Debug.Log(item["bag"]);
}
}
}

[説明] 
所持金(bag)から商品(wawawa,dadada)を購入する。
@最初の所持金 Awawawaを買ったときの残金 B両方買ったときの残金 の3つの順で1回ずつunityのコンソールに書き出す(つもりだった)。
unityで実行したところ、Aまで成功したのですが、以降ずーっとwawawaを買い続けてしまいます(-3 → 書き出し のループ)。

添削よろしくお願いします。
引用返信 編集キー/
■100722 / inTopicNo.2)  Re[1]: c#のコレクション、ループについての質問
□投稿者/ HattariB (42回)-(2022/10/22(Sat) 04:35:07)
No100721 (しーや さん) に返信
> 添削よろしくお願いします。

プログラミング勉強中なら、添削よりもレビューの方がいいですよ。
心が痛んだ分だけ成長するからw

で、もしもレビューするつもりがあるのならで良いけど、
無いなら無視で良いけれど、

@ABはそれぞれどこですか?
具体的に“残金”はどの変数で、どうやって保持されてるつもりで、どうなるつもりが、こうなった。
みたいなのを、もっとブレークダウンして具体的に示してみてくださいな。

行数と文法解釈と、例えば連想配列の扱い方だとかの用語に関する知識補填とか、
1行づつ説明してみて。
おそらく自力でわかっちゃうと思う。

001: public class LearningCurve : MonoBehaviour
002: {
003: Dictionary<string, int> item = new Dictionary<string, int>()
004: {
005: {"bag",25},
006: {"wawawa",3},
007: {"dadada",10},
008: };
009:
010: // Start is called before the first frame update
011: void Start()
012: {
013:
014: }
015:
016: // Update is called once per frame
017: void Update()
018: {
019: foreach (KeyValuePair <string ,int>kvp in item)
020: {
021: string buy = kvp.Key ;
022: switch (buy)
023: {
024: case "wawawa":
025: item["bag"] = item["bag"] - item ["wawawa"];
026: break;
027: case "dadada":
028: item["bag"] = item["bag"] - item["dadada"];
029: break;
030: default:
031: break;
032: }
033:
034: Debug.Log(item["bag"]);
035: }
036: }
037: }
引用返信 編集キー/
■100723 / inTopicNo.3)  Re[1]: c#のコレクション、ループについての質問
□投稿者/ アデル (1回)-(2022/10/22(Sat) 09:21:15)
Updateで毎回itemを全列挙してるからじゃないですかね
計算済みのフラグを用意すれば良いと思います
引用返信 編集キー/
■100725 / inTopicNo.4)  Re[1]: c#のコレクション、ループについての質問
□投稿者/ WebSurfer (2577回)-(2022/10/22(Sat) 09:57:47)
No100721 (しーや さん) に返信

foreach (KeyValuePair <string ,int>kvp in item) ループの中で、

item["bag"] = item["bag"] - item["wawawa"];

というようにコレクションを変更していますが、そもそもそれはやってはいけないことで、
InvalidOperationException がスローされるはずです。

自分は Unity は知らないので、Unity の特殊事情があるかのもしれませんが・・・
引用返信 編集キー/
■100726 / inTopicNo.5)  Re[1]: c#のコレクション、ループについての質問
□投稿者/ WebSurfer (2578回)-(2022/10/22(Sat) 10:16:08)
No100721 (しーや さん) に返信

No100725 で、

> InvalidOperationException がスローされるはずです。

と書いた件、質問者さんのコードを .NET Framework 4.8 のコンソールアプリにコピペして
確認しました。

foreach (KeyValuePair <string ,int>kvp in item) ループで、2 回目に、

item["bag"] = item["bag"] - item["wawawa"];

でコレクションを変更してますが、そうするとその次の foreach のところで、

System.InvalidOperationException: コレクションが変更されました。列挙操作は実行されない可能性があります。

という例外がスローされます。例外がスローされるのでそこでアプリは中断されます。

質問者さんのケースで、

> 以降ずーっとwawawaを買い続けてしまいます(-3 → 書き出し のループ)。

となったのは Unity の特殊事情ではないかと思います。

どうすべきかというと、以下のように foreach ループ内で item["bag"] を書き換えたり
しないことです。

internal class Program
    {
        static void Main(string[] args)
        {
            Dictionary<string, int> item = new Dictionary<string, int>()
            {
                {"bag",25},
                {"wawawa",3},
                {"dadada",10},
            };

            int bag = item["bag"];
            foreach (KeyValuePair<string, int> kvp in item)
            {
                string buy = kvp.Key;                
                switch (buy)
                {
                    case "wawawa":
                        bag = bag - item["wawawa"];
                        break;
                    case "dadada":
                        bag = bag - item["dadada"];
                        break;
                    default:
                        break;
                }

                Console.WriteLine($"{bag}");
            }
        }
    }
}

結果は:

25
22
12

引用返信 編集キー/
■100730 / inTopicNo.6)  Re[2]: c#のコレクション、ループについての質問
□投稿者/ しーや (2回)-(2022/10/22(Sat) 15:40:11)
No100722 (HattariB さん) に返信
> プログラミング勉強中なら、添削よりもレビューの方がいいですよ。

レビューの方が適切ですね。あんまり考えず言葉を選んでました。

> 行数と文法解釈と、例えば連想配列の扱い方だとかの用語に関する知識補填とか、
> 1行づつ説明してみて。
> おそらく自力でわかっちゃうと思う。

他の方のヒントも参考にしながら見直したら、

・-3でループ はupdeteで行っていたから繰り返されていた  →startにコードをおく
・Bが行われない はディクショナリから呼び出していたから →item["bag]を変数に置き換えてforeachの中で使う

以上で解決できました。
ありがとうございました
引用返信 編集キー/
■100731 / inTopicNo.7)  Re[2]: c#のコレクション、ループについての質問
□投稿者/ しーや (3回)-(2022/10/22(Sat) 15:42:48)
No100723 (アデル さん) に返信
簡潔に要点をまとめてくれてありがとうございます。
おかげで解決しました。
ありがとうございました。
引用返信 編集キー/
■100732 / inTopicNo.8)  Re[2]: c#のコレクション、ループについての質問
□投稿者/ しーや (4回)-(2022/10/22(Sat) 15:46:47)
No100725 (WebSurfer さん) に返信
> ■No100721 (しーや さん) に返信
>
> foreach (KeyValuePair <string ,int>kvp in item) ループの中で、
>
> item["bag"] = item["bag"] - item["wawawa"];
>
> というようにコレクションを変更していますが、そもそもそれはやってはいけないことで、
> InvalidOperationException がスローされるはずです。

やってはいけないことだったんですね。
変数に置き換えることで解決しました。

> 自分は Unity は知らないので、Unity の特殊事情があるかのもしれませんが・・・

unityは悪くありませんでした。
全部自分のコードがわるかったです。

ありがとうございました。
引用返信 編集キー/
■100733 / inTopicNo.9)  Re[2]: c#のコレクション、ループについての質問
□投稿者/ しーや (5回)-(2022/10/22(Sat) 15:52:00)
2022/10/28(Fri) 00:24:34 編集(投稿者)
2022/10/27(Thu) 23:59:45 編集(投稿者)
2022/10/27(Thu) 23:59:38 編集(投稿者)

No100726 (WebSurfer さん) に返信
> ■No100721 (しーや さん) に返信
>
> No100725 で、
>
>>InvalidOperationException がスローされるはずです。
>
> と書いた件、質問者さんのコードを .NET Framework 4.8 のコンソールアプリにコピペして
> 確認しました。

わざわざありがとうございます。

>>以降ずーっとwawawaを買い続けてしまいます(-3 → 書き出し のループ)。
>
> となったのは Unity の特殊事情ではないかと思います。

updeteの中だったので繰り返されてました。
startの中に移すことで解決しました。
引用返信 編集キー/
■100734 / inTopicNo.10)  Re[3]: c#のコレクション、ループについての質問
□投稿者/ HattariB (44回)-(2022/10/22(Sat) 18:09:04)
No100730 (しーや さん) に返信
> 以上で解決できました。
助けを貰いながらでも、自力で解決出来たらうれしいでしょ。
がんばってくだすれ。
引用返信 編集キー/
■100744 / inTopicNo.11)  Re[3]: c#のコレクション、ループについての質問
□投稿者/ WebSurfer (2580回)-(2022/10/23(Sun) 09:24:00)
No100733 (しーや さん) に返信

解決したのであれば「解決済み」マークをつけてこのスレッドはクローズしてください。
引用返信 編集キー/
■100799 / inTopicNo.12)  Re[4]: c#のコレクション、ループについての質問
□投稿者/ しーや (6回)-(2022/10/28(Fri) 00:23:38)
No100744 (WebSurfer さん) に返信
> ■No100733 (しーや さん) に返信
>
> 解決したのであれば「解決済み」マークをつけてこのスレッドはクローズしてください。

できてるつもりでしたすいません。
これでできてますか?
解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ