Day30 ウォームアップ(10分)

広告

※10分の使い方は、「進め方(10分の使い方)」を参照
※生成AIは使いません
※全部できなくてOK
※今日のゴール目安:提出A(問題1が動く)で合格、提出B(1・2)で標準到達、提出C+発展で上位到達


今日の準備(ウォームアップの前に)

  1. Day30.cs を追加する(ソリューションエクスプローラーで、ソリューションの下にある プロジェクト「MiniPractice」を右クリック → 追加 → クラス → 名前を Day30.cs
  2. Day30.cs の先頭に using System.Linq; を追加する(1行。ファイルの using の並びの一番下で構いません)
  3. 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 で書いて構いません。

  1. 該当する各 Product の Name を 1行ずつ表示する(Where した結果を foreach で回す)
  2. 該当する Product の Price の合計1行で表示する(Sum
  3. 続けて、Price の平均1行で表示する(Average。教材の数値例は整数のままでよいです → (int) でキャストして表示してもよいです)
  4. 続けて、Price の最大1行で表示する(Max
  5. 続けて、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 の指示に従って進めてください。

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

広告

C#

Posted by hidepon