【学習】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… に戻りたいですか?
- 戻りたくないなら、次は Enemy クラスを追加する で 種類が増えたときの型の持ち方 を見ます。
発展アイデア
訪問数 2 回, 今日の訪問数 2回



ディスカッション
コメント一覧
まだ、コメントがありません