Day30 ウォームアップ(10分)
※10分の使い方は、「進め方(10分の使い方)」を参照
※生成AIは使いません
※全部できなくてOK
※今日のゴール目安:提出A(問題1が動く)で合格、提出B(1・2)で標準到達、提出C+発展で上位到達
今日の準備(ウォームアップの前に)
- Day30.cs を追加する(ソリューションエクスプローラーで、ソリューションの下にある プロジェクト「MiniPractice」を右クリック → 追加 → クラス → 名前を Day30.cs)
- Day30.cs の先頭に
using System.Linq;を追加する(1行。ファイルのusingの並びの一番下で構いません) - Program.cs を開き、Main 内の
Day29.Run()をDay30.Run()に書き換える
最初に:今日のクラスの形を確認
Day29 と同じ Product クラスを使います。Run() の中では LINQ(ラムダ式と Where / Count / Sum など)で、同じ処理を短く書く練習です。
using System.Linq;
internal class Day30
{
class Product
{
public string Name { get; set; }
public int Price { get; set; }
public bool IsDiscount()
{
return Price >= 1000;
}
}
public static void Run()
{
// ここに書く
}
}
using System.Linq;がないと、WhereやCountが使えずエラーになりますpr => pr.IsDiscount()は「prを受け取り、IsDiscount()の結果を返す」というラムダ式です(今日は書き方を真似るところからで大丈夫です)
🔹 出力について(教材共通)
教材では 簡潔な出力例(個数だけ・該当語のみ・数値のみなど)を載せています。条件・数え方・集約が正しければ、Console.WriteLine に「合計:」などのラベルや、$"…: {値}" のような説明付きで出しても構いません。
🔹 Day29 の振り返り(1分)
foreach+if…IsDiscount()がtrueのものだけを扱う、という書き方をしました- 今日のポイント:同じ条件でも、
WhereやCountを使うとループが短くまとまります。Day29 のコードを思い出しながら、結果が同じになるかを確認しましょう
🔹 今日のポイント(LINQ)
| やりたいこと | LINQ の例(イメージ) |
|---|---|
| 条件で絞る | products.Where(pr => pr.IsDiscount()) |
| 個数を数える | products.Count(pr => pr.IsDiscount()) |
| 合計 | ....Sum(pr => pr.Price)(.... は「絞り込んだあとの列」) |
Whereの結果は、そのままforeachで回せます(foreach (Product pr in products.Where(...)))- 転移(Day29)と LINQ(Day30)は別日です。今日は「短い書き方」を試す日だと考えてください
進め方(10分の使い方)
- 最初の5分:教科書・ノート・これまで自分が書いたコードも見ずに、自分の力だけで書いてみましょう。止まっても構いません。思い出そうとする時間が大事です。
- 後半5分:教科書・ノート・これまで自分が書いたコードを見てOKです。「どこを見ればよいか」「どう直せばよいか」を考えながら、完成に近づけましょう。
1限の過ごし方(目安)
細かい指示は Slack・スライド・口頭 に従ってください(教室のホワイトボードなどに書かれた内容があれば、それも含みます)。
| 時間(目安) | 内容 |
|---|---|
| 0〜15分 | ウォームアップ(準備・今日の課題・提出・動作確認)。課題の進め方は下の**「進め方(10分の使い方)」**のとおりです。 |
| 15〜45分 | 学習時間(これまでの Day 課題(提出コードの見直し・未完成の続き)、教科書の自習・予習など。Slack・スライド・口頭の指示を最優先) |
| 45〜50分 | 振り返りなど(指示に従う) |
- 提出が終わったら(ウォームアップの途中でも可)… Commit/Push と Slack「Day30 完了」は提出ルールに従い、採点を待たず次の学習に進みます。
提出ルール(重要)
- 提出A(最低ライン):問題1だけ動けばOK
- 提出B(標準):問題1・2まで
- 提出C(到達):問題1・2・3(余裕があれば発展)
※今日は LINQ はじめてでも大丈夫です。動けば合格ラインにしています。
- 提出方法:GitHub Desktop で Commit → Push してください。1問ごとでも、まとめて1回でもOKです。
- Slack:「Day30 完了しました」と一言送ってください。
■ 問題1(基礎)
次の products 配列を Run() の中に用意してください(Day29 と同じデータです)。
Product[] products =
{
new Product { Name = "ノート", Price = 200 },
new Product { Name = "ボールペン", Price = 150 },
new Product { Name = "ファイル", Price = 300 },
new Product { Name = "バインダー", Price = 1200 },
new Product { Name = "ラベルシール", Price = 800 },
new Product { Name = "ホワイトボード", Price = 3500 },
new Product { Name = "クリアケース", Price = 1500 },
};
IsDiscount() が true になる Product だけに絞り込み、Name を1行ずつ表示してください。
Whereを使います:products.Where(pr => pr.IsDiscount())- 絞り込んだあと、
foreachでpr.NameをConsole.WriteLineしてください
ヒント:foreach (Product pr in products.Where(pr => pr.IsDiscount())) の形でも、var query = products.Where(...); に分けてから foreachしても構いません。
■ 問題2(集計)
同じ products 配列について、IsDiscount() が true になる Product が 何個あるかを、LINQ の Count を使って求め、個数だけを1行で表示してください。
ヒント:products.Count(pr => pr.IsDiscount())
■ 問題3(合計)
同じ products 配列について、IsDiscount() が true になる Product の Price の合計を、LINQ の Sum を使って求め、合計だけを1行で表示してください。
ヒント:Where で絞り込んでから Sum(pr => pr.Price) します。
■ 発展A(余裕がある人)
同じ products 配列について、IsDiscount() が true になる Product だけを対象に、次の順序どおりに表示してください。できるところから LINQ で書いて構いません。
- 該当する各 Product の Name を 1行ずつ表示する(
Whereした結果をforeachで回す) - 該当する Product の Price の合計を1行で表示する(
Sum) - 続けて、Price の平均を1行で表示する(
Average。教材の数値例は整数のままでよいです →(int)でキャストして表示してもよいです) - 続けて、Price の最大を1行で表示する(
Max) - 続けて、Price の最小を1行で表示する(
Min)
ポイント:Where(...).ToList() として List<Product> にしてから、同じ list を使い回すと書きやすいです(ToList() を使うには、ファイル先頭に using System.Collections.Generic; が必要な場合があります)。
■ 発展B(発展Aが動いたらチャレンジ)
Product クラスに IsPremium() メソッドを追加しましょう(Day29 発展B と同じです)。
- メソッド名:
IsPremium - 戻り値:
bool - 中身:
Price >= 2000のときtrueを返す
Run 内で IsPremium() が true の Product の Name を、Where を使って絞り込み、1行ずつ表示してください。
// 呼び出しのイメージ(foreach 例)
foreach (Product pr in products.Where(pr => pr.IsPremium()))
{
Console.WriteLine(pr.Name);
}
⚠️ つまずきやすい点
using System.Linq;を忘れる …Where/Count/Sumなどが使えずエラーになります- ラムダの
=>… 今日はpr => pr.IsDiscount()の形を教材どおりに真似て大丈夫です Averageの型 …Averageは結果がdoubleになります。教材のように 整数だけ出したいときは(int)でキャストしますWhereのあと …foreachする列が「絞り込まれた Product だけの列」になる、というイメージです
🎯 今日の目的
- Day29 と同じデータで、**LINQ(
Where/Count/Sumなど)**を一通り触る foreach+ifで書いた処理と、結果が同じになることを確認する- 余裕がある人は
Average/Max/MinやToListにも触れる
次へ
Day31 では ポリモーフィズム(virtual / override)の練習に入ります。まだ Unity エディタは使いません。講師・Slack の指示に従って進めてください。



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