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 件だったときのメッセージや処理を工夫する
といった練習を通して、 「検索ロジック」を自分の手で自然に書けるようになっていってください。
