【学習】foreach で全員に同じ処理(コピペをやめる)

広告

前回 までで、List<Player> に複数人の Player を入れられるようになりました。

しかし、全員に同じことをしたい ときに、添字だとこんな誘惑があります。

players[0]players[1]players[2]…と行をコピペする

今回はそのコピペをやめて、「1人分の処理」を全員に配る 書き方として foreach を使います。


ソリューションとプロジェクトを作る

  • テンプレート: コンソール アプリ
  • プロジェクト名ClassAwakening03(任意)

using System.Collections.Generic; を忘れずに。


違和感:コピペ地獄の予感

例えば全員に 10 ダメージです。

players[0].Hp -= 10;
players[1].Hp -= 10;
players[2].Hp -= 10;

3人ならまだ我慢できます。でも 人数が変わったら、このコードはそのままでは通用しません。


foreach の形

foreach (Player p in players)
{
    p.Hp -= 10;
}

意味はシンプルです。

  • players の中から 1人ずつ p として取り出す
  • { } の中は 「1人分のルール」 として書く

表示も同じ

foreach (Player p in players)
{
    Console.WriteLine($"{p.Name} HP={p.Hp}");
}

プログラムの流れ

List に複数の Player が入っている
        ↓
foreach が1人ずつ取り出す(p)
        ↓
{ } の中の処理が、その回の p に対して実行される

完成コード(例)

using System;
using System.Collections.Generic;

namespace ClassAwakening03
{
    class Player
    {
        public string Name;
        public int Hp;

        public Player(string name, int hp)
        {
            Name = name;
            Hp = hp;
        }
    }

    internal class Program
    {
        static void Main(string[] args)
        {
            List<Player> players = new List<Player>();
            players.Add(new Player("勇者A", 100));
            players.Add(new Player("勇者B", 90));
            players.Add(new Player("勇者C", 80));

            foreach (Player p in players)
            {
                p.Hp -= 10;
            }

            foreach (Player p in players)
            {
                Console.WriteLine($"{p.Name} HP={p.Hp}");
            }
        }
    }
}

重要ポイント

  • foreach は 「全員に同じ処理」 の定番です
  • { } の中を 1人向けに書く と読みやすい、というのがコツです
  • var p in players と書いても同じ意味です(型が推論されます)

最後の問い

味方の Player がいる世界に、 も出したくなったとします。

enemyName1 enemyHp1… に戻りたいですか?


発展アイデア

訪問数 2 回, 今日の訪問数 2回

広告