C# 2-6 データ管理の鉄板パターン!クラス・プロパティ・List・LINQを徹底解説

C#の学習を進めていくと、必ずぶつかる壁があります。「変数が多すぎて管理しきれない」「特定の条件のデータだけを探すのが面倒くさい」といった、データ管理の悩みです。

実は、C#におけるデータの扱い方には「これさえ覚えておけば間違いない」という鉄板のパターンが存在します。

この記事では、実務やゲーム開発(Unityなど)でも必ず使われる「クラス・プロパティ・List・LINQ」を組み合わせた4つのステップを、具体的なコードを交えて徹底解説します。


なぜ「鉄板パターン」が必要なのか?

例えば「RPGのアイテム一覧」を作るとします。初心者によくある失敗は、配列をバラバラに作ってしまうことです。

C#

// 悪い例:データがバラバラで管理が大変
string[] itemNames = { "薬草", "毒消し", "剣" };
int[] itemPrices = { 10, 8, 150 };

これでは、アイテムが増えた時に名前と価格がズレてしまう危険性があります。これを美しく、かつ安全に管理するための4ステップを見ていきましょう。


ステップ1:クラスを作る(データの「1件分」の形を決める)

まずは、バラバラのデータを一つにまとめる「設計図」を作ります。これがクラス(Class)の役割です。

今回は、商品のデータを扱うための Product(商品)というクラスを作ってみます。

C#

// 商品データの「型」を定義する
public class Product
{
    // ここに商品が持つべき情報(名前、価格など)を書いていく
}

クラスを作ることで、C#に「Productという新しいデータの種類ができたよ」と教えることができます。これで、名前と価格をワンセットで扱える準備が整いました。


ステップ2:プロパティで項目を作る(データを保護する)

次に、作ったクラスの中に「項目」を追加します。ここで重要なのが、単なる変数(フィールド)ではなく**プロパティ(Property)**を使うことです。

プロパティを使う最大の理由は**「予期せぬおかしなデータが入るのを防ぐ(データの保護)」**ためです。

C#

public class Product
{
    // 自動実装プロパティ(特に制限がない場合はこれでOK)
    public string Name { get; set; }

    // フルプロパティ(データの保護をしたい場合)
    private int _price; // 裏側でデータを保持する隠し変数
    
    public int Price
    {
        get { return _price; } // データを読み取るときの処理
        set 
        {
            // データを書き込むときの処理(バリデーション)
            if (value < 0)
            {
                // 価格がマイナスになるのはおかしいので、強制的に0にする
                _price = 0; 
                Console.WriteLine("エラー:価格は0円以上に設定してください。");
            }
            else
            {
                _price = value; // 正常な値ならそのままセット
            }
        }
    }
}

このようにプロパティを使えば、「価格にマイナス1万円を設定されてバグる」といった事故を未然に防ぐことができます。


ステップ3:List<T> で管理する(複数のデータをまとめる)

安全な「1件分のデータ(Product)」が完成したら、次はそのデータを複数個まとめて管理します。ここで大活躍するのが List<T>(リスト) です。

配列(Array)は最初に決めた数から増やせませんが、リストなら後からいくらでもデータを追加・削除できます。

C#

using System.Collections.Generic; // Listを使うために必要

class Program
{
    static void Main()
    {
        // Productを入れるための「空のリスト」を作成
        List<Product> productList = new List<Product>();

        // リストにデータを追加していく (Addメソッド)
        productList.Add(new Product { Name = "コーヒー", Price = 400 });
        productList.Add(new Product { Name = "紅茶", Price = 350 });
        productList.Add(new Product { Name = "高級メロンパン", Price = 1200 });
        productList.Add(new Product { Name = "水", Price = 100 });

        // リストの数を数える
        Console.WriteLine($"現在の商品数は {productList.Count} 個です。");
    }
}

これで、どれだけ商品が増えても productList という一つの変数で一元管理できるようになりました。


ステップ4:LINQ で加工する(必要なデータだけ取り出す)

リストにデータが溜まったら、「500円以下の商品だけ見たい」「価格が高い順に並べ替えたい」といった要望が出てきます。

これを for 文や if 文で書くとコードが長くて複雑になりますが、C#の魔法の技術 LINQ(リンク) を使えば、たった1〜2行で実現できます。

C#

using System.Linq; // LINQを使うために必要(超重要!)

// 続きのコード...

// 【魔法1:条件で絞り込む (Where)】
// 500円以下の商品だけを抽出
var cheapProducts = productList.Where(p => p.Price <= 500).ToList();

Console.WriteLine("--- 500円以下の商品 ---");
foreach (var item in cheapProducts)
{
    Console.WriteLine($"{item.Name} : {item.Price}円");
}

// 【魔法2:並べ替える (OrderBy / OrderByDescending)】
// 価格が高い順(降順)に並べ替える
var sortedProducts = productList.OrderByDescending(p => p.Price).ToList();

// 【魔法3:計算する (Max / Min / Average)】
// 一番高い商品の価格を取得
int maxPrice = productList.Max(p => p.Price);
Console.WriteLine($"最高値は {maxPrice} 円です。");

矢印のような記号 => はラムダ式と呼ばれ、「リストの中身(p)の、価格(p.Price)が500以下のもの」というように、直感的にデータを操作できます。


まとめ:この4ステップがC#の基礎にして奥義

  1. Class: データの形を決める
  2. Property: データを保護する
  3. List: データを集める
  4. LINQ: データを抽出・加工する

この流れは、実務のWebアプリケーション開発でも、Unityでのゲームアイテム管理でも全く同じように使われます。この鉄板パターンをマスターすれば、あなたのC#スキルは確実に一段階レベルアップします!