基礎から学ぶC#入門 90日コース | 配列・コレクション・文字列 - Day 26:データ検索

C# 90日で身につけるC#
スポンサーリンク
スポンサーリンク

Day 26 のゴールと全体像

Day 26 では、「配列やリストの中から、欲しいデータを探し出す」ための基本テクニックを学びます。 扱うテーマは次の 4 つです。

  • ループによる検索
  • 条件一致(完全一致)
  • 部分一致
  • フラグ管理

LINQ や高度な検索機能に進む前に、 「自分の手でループを書いて探す」感覚をしっかり身につけておくことが大切です。

ループによる検索の基本

なぜ「ループで探す」ことが重要なのか

配列や List<T> の中から特定の値を探したいとき、 最も基本的な方法は ループを使って1つずつチェックすることです。

イメージとしては、

「箱の中に並んだカードを、先頭から順番にめくっていく」

ような感じです。

例:int 配列から特定の値を探す

using System;

class Program
{
    static void Main(string[] args)
    {
        int[] numbers = { 10, 20, 30, 40, 50 };
        int target = 30; // 探したい値

        // 見つかった位置(インデックス)を保存する変数。-1 は「見つからなかった」の意味。
        int foundIndex = -1;

        // ループで 1 つずつチェックします
        for (int i = 0; i < numbers.Length; i++)
        {
            // 現在の要素が target と一致するか
            if (numbers[i] == target)
            {
                foundIndex = i; // 見つかった位置を記録
                break;          // これ以上探す必要がないのでループを抜ける
            }
        }

        if (foundIndex >= 0)
        {
            Console.WriteLine($"{target} はインデックス {foundIndex} に見つかりました。");
        }
        else
        {
            Console.WriteLine($"{target} は配列の中に見つかりませんでした。");
        }

        Console.ReadLine();
    }
}
C#

重要ポイント:

  • ループで「1つずつ」チェックするのが基本です。
  • 見つかった位置を変数に記録しておきます。
  • 見つかったら break でループを抜けることで、無駄な処理を減らせます。

条件一致(完全一致)の検索

「この値と完全に同じものを探したい」

完全一致とは、

「値がぴったり同じものだけを探す」

という意味です。

数値だけでなく、文字列でも同じ考え方で検索できます。

例:名前リストから特定の名前を探す

using System;
using System.Collections.Generic;

class Program
{
    static void Main(string[] args)
    {
        List<string> names = new List<string>
        {
            "Alice",
            "Bob",
            "Charlie",
            "Dave"
        };

        string targetName = "Charlie"; // 探したい名前

        int foundIndex = -1;

        for (int i = 0; i < names.Count; i++)
        {
            // 完全一致の比較
            if (names[i] == targetName)
            {
                foundIndex = i;
                break;
            }
        }

        if (foundIndex >= 0)
        {
            Console.WriteLine($"{targetName} さんはインデックス {foundIndex} に見つかりました。");
        }
        else
        {
            Console.WriteLine($"{targetName} さんはリストに存在しません。");
        }

        Console.ReadLine();
    }
}
C#

重要ポイント:

  • 完全一致では、== を使って比較します。
  • 文字列の場合、大文字・小文字の違いも区別されます("Alice""alice" は別物)。
  • 「ID」「コード」「正確な名前」など、誤差が許されない検索に向いています。

部分一致の検索

「この文字列を含んでいるものを探したい」

部分一致とは、

「文字列の一部に特定のキーワードが含まれているものを探す」

という意味です。

C# では、string.Contains を使って部分一致を判定できます。

例:商品名リストから「Apple」を含むものを探す

using System;
using System.Collections.Generic;

class Program
{
    static void Main(string[] args)
    {
        List<string> products = new List<string>
        {
            "Apple Juice",
            "Orange Juice",
            "Pineapple Cake",
            "Grape Soda"
        };

        string keyword = "Apple"; // 部分一致で探したいキーワード

        Console.WriteLine($"キーワード \"{keyword}\" を含む商品を検索します。\n");

        for (int i = 0; i < products.Count; i++)
        {
            string name = products[i];

            // 部分一致の判定
            if (name.Contains(keyword))
            {
                Console.WriteLine($"インデックス {i}: {name}");
            }
        }

        Console.ReadLine();
    }
}
C#

重要ポイント:

  • Contains は「部分文字列が含まれているか」を判定します。
  • 部分一致検索では、複数件ヒットすることが多いので、 「見つかったら全部表示する」スタイルがよく使われます。
  • 検索機能・フィルタリング・候補表示などに向いています。

フラグ管理による「見つかったかどうか」の判定

フラグとは何か

フラグとは、

「ある条件が満たされたかどうか」を記録するための真偽値(bool

のことです。

検索処理では、

  • 見つかった → true
  • 見つからなかった → false

という形でフラグを使うことがよくあります。

例:部分一致検索で「1件でも見つかったか」を判定する

using System;
using System.Collections.Generic;

class Program
{
    static void Main(string[] args)
    {
        List<string> products = new List<string>
        {
            "Apple Juice",
            "Orange Juice",
            "Pineapple Cake",
            "Grape Soda"
        };

        string keyword = "Apple";

        bool found = false; // フラグ。最初は「見つかっていない」ので false。

        Console.WriteLine($"キーワード \"{keyword}\" を含む商品を検索します。\n");

        for (int i = 0; i < products.Count; i++)
        {
            string name = products[i];

            if (name.Contains(keyword))
            {
                Console.WriteLine($"インデックス {i}: {name}");
                found = true; // 1件でも見つかったら true にする
            }
        }

        // ループが終わったあとで、フラグをチェック
        if (!found)
        {
            Console.WriteLine("\n該当する商品は見つかりませんでした。");
        }

        Console.ReadLine();
    }
}
C#

重要ポイント:

  • フラグ変数(bool found)を使うことで、 「ループの中で何かが起きたかどうか」をループの外で判断できます。
  • 検索結果が 0 件だった場合に、 「見つかりませんでした」とメッセージを出すなどの処理に役立ちます。

フラグ管理+インデックス管理の組み合わせ

「最初に見つかった 1 件だけを扱いたい」

完全一致検索では、

「最初に見つかった 1 件だけを扱いたい」

ということが多いです。

その場合、

  • 見つかった位置(インデックス)を記録する変数
  • 見つかったかどうかのフラグ

を組み合わせると分かりやすくなります。

例:ユーザー名リストから特定ユーザーを検索する

using System;
using System.Collections.Generic;

class Program
{
    static void Main(string[] args)
    {
        List<string> users = new List<string>
        {
            "admin",
            "guest",
            "mono",
            "user01"
        };

        string targetUser = "mono";

        bool found = false;   // 見つかったかどうか
        int foundIndex = -1;  // 見つかった位置。-1 は「未検出」。

        for (int i = 0; i < users.Count; i++)
        {
            if (users[i] == targetUser)
            {
                found = true;
                foundIndex = i;
                break; // 最初の 1 件だけでよいのでループを抜ける
            }
        }

        if (found)
        {
            Console.WriteLine($"ユーザー \"{targetUser}\" はインデックス {foundIndex} に存在します。");
        }
        else
        {
            Console.WriteLine($"ユーザー \"{targetUser}\" はリストに存在しません。");
        }

        Console.ReadLine();
    }
}
C#

重要ポイント:

  • フラグ(found)とインデックス(foundIndex)を組み合わせることで、 「見つかったかどうか」と「どこにあったか」を両方管理できます。
  • break を使って、最初の 1 件だけを対象にすることもよくあります。

練習テンプレート:検索処理の基本形

完全一致検索テンプレート

int[] data = { 1, 3, 5, 7, 9 };
int target = 7;

bool found = false;
int foundIndex = -1;

for (int i = 0; i < data.Length; i++)
{
    if (data[i] == target)
    {
        found = true;
        foundIndex = i;
        break;
    }
}

if (found)
{
    Console.WriteLine($"{target} はインデックス {foundIndex} に見つかりました。");
}
else
{
    Console.WriteLine($"{target} は見つかりませんでした。");
}
C#

部分一致検索テンプレート

List<string> items = new List<string>
{
    "apple",
    "banana",
    "grape",
    "pineapple"
};

string keyword = "apple";
bool found = false;

for (int i = 0; i < items.Count; i++)
{
    if (items[i].Contains(keyword))
    {
        Console.WriteLine($"インデックス {i}: {items[i]}");
        found = true;
    }
}

if (!found)
{
    Console.WriteLine("キーワードを含む要素は見つかりませんでした。");
}
C#

Day 26 のまとめ

Day 26 では、

  • ループによる検索
  • 条件一致(完全一致)
  • 部分一致
  • フラグ管理

という「データ検索の基本」を学びました。

これらは、

「配列やリストの中から、欲しいものだけを見つけて取り出す」

ための土台となる考え方です。

今後、LINQ や高度な検索機能を使うようになっても、 この「ループで探す」「条件で絞る」「フラグで結果を管理する」感覚は必ず役に立ちます。

ぜひ、

  • 数値配列から特定の範囲の値だけを探す
  • 文字列リストから特定のキーワードを含むものだけを抽出する
  • 検索結果が 0 件だったときのメッセージや処理を工夫する

といった練習を通して、 「検索ロジック」を自分の手で自然に書けるようになっていってください。

タイトルとURLをコピーしました