C#で検索機能を実装する方法|文字列・配列・List・LINQを初心者向けに解説
はじめに
C#でアプリケーションを作っていると、「文字列の中に特定の単語が含まれているか調べたい」「配列やListの中から条件に合うデータを探したい」「ユーザーが入力したキーワードで一覧を絞り込みたい」といった場面がよくあります。
このような処理をまとめて「検索」と呼びます。
C#の検索には、Contains、IndexOf、Find、FindAll、Where、FirstOrDefault、Anyなど、目的に応じてさまざまな方法があります。最初はメソッドの種類が多く感じるかもしれませんが、「何を検索したいのか」「結果として何が欲しいのか」を整理すると、使い分けはそれほど難しくありません。
この記事では、C#で検索機能を実装する方法を、文字列・配列・List・LINQに分けて初心者向けに解説します。基本的な検索処理から、複数条件での検索、ユーザー入力を使った実践的な検索機能、よくあるエラーの対処法まで順番に見ていきましょう。
1. C#の検索機能でできること
C#の検索機能を使うと、文字列やコレクションの中から、指定した条件に一致するデータを見つけることができます。
たとえば、次のような処理ができます。
C#string text = "C#で検索機能を作ります";
bool contains = text.Contains("検索");
Console.WriteLine(contains); // True
この例では、文字列の中に「検索」という単語が含まれているかを調べています。
C#では、対象が文字列なのか、配列なのか、Listなのか、あるいはデータ一覧なのかによって、使うメソッドが変わります。
1-1. この記事で扱う「検索」の範囲
この記事で扱う「検索」は、主に次のような処理です。
C#// 文字列の検索
"Hello C#".Contains("C#");
// 配列の検索
Array.IndexOf(numbers, 3);
// Listの検索
users.Find(user => user.Name == "田中");
// LINQによる検索
users.Where(user => user.Age >= 20);
データベース検索やSQLの詳細、全文検索エンジンのような高度な検索機能は扱いません。まずはC#の基本文法として使える検索処理を理解することを目的にします。
初心者の方は、まず文字列、配列、List、LINQの検索方法を押さえると、実務でもよく使う検索処理を書けるようになります。
1-2. 文字列・配列・List・LINQで検索方法が変わる理由
C#では、検索対象のデータ型によって使えるメソッドが異なります。
たとえば、文字列を検索する場合は、ContainsやIndexOfを使います。
C#string message = "Hello World";
bool result = message.Contains("World");
一方、配列を検索する場合は、Array.IndexOfやArray.Findを使います。
C#int[] numbers = { 10, 20, 30 };
int index = Array.IndexOf(numbers, 20);
Listを検索する場合は、List<T>が持っているContains、Find、FindAllなどが使えます。
C#List<string> names = new List<string> { "田中", "佐藤", "鈴木" };
string name = names.Find(n => n == "佐藤");
さらに、LINQを使うと、配列やListなどのコレクションに対して、より柔軟な条件検索ができます。
C#var results = names.Where(n => n.Contains("田"));
このように、C#で検索を行うときは、まず「検索対象の型」を確認することが大切です。
1-3. 初心者がまず覚えるべき検索メソッド一覧
C#の検索で初心者がまず覚えるべきメソッドは次のとおりです。
| 対象 | メソッド | 用途 |
|---|---|---|
| 文字列 | Contains | 指定した文字列を含むか調べる |
| 文字列 | IndexOf | 指定した文字列の位置を取得する |
| 文字列 | StartsWith | 指定した文字列で始まるか調べる |
| 文字列 | EndsWith | 指定した文字列で終わるか調べる |
| 配列 | Array.IndexOf | 要素の位置を検索する |
| 配列 | Array.Exists | 条件に一致する要素があるか調べる |
| 配列 | Array.Find | 条件に一致する最初の要素を取得する |
| 配列 | Array.FindAll | 条件に一致するすべての要素を取得する |
| List | Contains | 要素が含まれるか調べる |
| List | Find | 条件に一致する最初の要素を取得する |
| List | FindAll | 条件に一致する複数の要素を取得する |
| LINQ | Where | 条件に一致するデータを絞り込む |
| LINQ | FirstOrDefault | 最初の要素、または既定値を取得する |
| LINQ | Any | 条件に一致する要素があるか判定する |
| LINQ | Count | 条件に一致する件数を取得する |
まずは、「含まれているか調べたいならContains」「条件で絞り込みたいならWhere」「最初の1件が欲しいならFindまたはFirstOrDefault」と覚えておくとよいでしょう。
2. C#で文字列を検索する方法
C#で文字列を検索する場合は、string型のメソッドを使います。代表的なものは、Contains、IndexOf、StartsWith、EndsWithです。
文字列検索は、ユーザー入力のチェック、キーワード検索、ファイル名の判定、メールアドレスの形式確認など、さまざまな場面で使われます。
2-1. Containsで文字列が含まれるか判定する
Containsは、文字列の中に指定した文字列が含まれているかを判定するメソッドです。
C#string text = "C#で検索機能を実装します";
bool result = text.Contains("検索");
Console.WriteLine(result); // True
Containsの戻り値はboolです。含まれていればtrue、含まれていなければfalseになります。
C#string text = "C#プログラミング入門";
if (text.Contains("C#"))
{
Console.WriteLine("C#に関する文章です");
}
else
{
Console.WriteLine("C#は含まれていません");
}
Containsは、「あるかどうか」だけを知りたい場合に向いています。位置までは必要なく、単純に含まれるかを調べたいときに使いましょう。
2-2. IndexOfで文字列の位置を取得する
IndexOfは、指定した文字列が最初に出現する位置を取得するメソッドです。
C#string text = "C#で検索機能を実装します";
int index = text.IndexOf("検索");
Console.WriteLine(index); // 3
C#の文字列の位置は0から始まります。
C#string text = "ABCDE";
Console.WriteLine(text.IndexOf("A")); // 0
Console.WriteLine(text.IndexOf("C")); // 2
指定した文字列が見つからない場合、IndexOfは-1を返します。
C#string text = "C#入門";
int index = text.IndexOf("Java");
if (index == -1)
{
Console.WriteLine("見つかりませんでした");
}
else
{
Console.WriteLine($"見つかった位置: {index}");
}
IndexOfは、検索対象が存在するかだけでなく、「どの位置にあるか」を知りたいときに使います。
2-3. StartsWith・EndsWithで前方一致・後方一致を判定する
StartsWithは、文字列が指定した文字列で始まるかを判定します。
C#string fileName = "report_2026.pdf";
bool result = fileName.StartsWith("report");
Console.WriteLine(result); // True
EndsWithは、文字列が指定した文字列で終わるかを判定します。
C#string fileName = "report_2026.pdf";
bool result = fileName.EndsWith(".pdf");
Console.WriteLine(result); // True
たとえば、ファイルの拡張子を判定するときにはEndsWithがよく使われます。
C#string fileName = "photo.jpg";
if (fileName.EndsWith(".jpg"))
{
Console.WriteLine("JPEG画像です");
}
前方一致や後方一致の検索は、商品コード、ファイル名、URL、IDなどを判定するときに便利です。
2-4. 大文字・小文字を区別せずに検索する方法
通常のContainsやIndexOfでは、大文字と小文字が区別されます。
C#string text = "Hello C#";
Console.WriteLine(text.Contains("hello")); // False
大文字・小文字を区別せずに検索したい場合は、StringComparison.OrdinalIgnoreCaseを指定します。
C#string text = "Hello C#";
bool result = text.Contains("hello", StringComparison.OrdinalIgnoreCase);
Console.WriteLine(result); // True
IndexOfでも同じように指定できます。
C#string text = "Hello C#";
int index = text.IndexOf("hello", StringComparison.OrdinalIgnoreCase);
Console.WriteLine(index); // 0
StartsWithやEndsWithでも使えます。
C#string fileName = "Sample.TXT";
bool result = fileName.EndsWith(".txt", StringComparison.OrdinalIgnoreCase);
Console.WriteLine(result); // True
ユーザーが入力する検索キーワードは、大文字・小文字が混ざる可能性があります。そのため、検索機能を作るときは、大文字・小文字を区別する必要があるかを事前に考えておきましょう。
2-5. 空文字・nullを検索するときの注意点
文字列検索では、nullや空文字に注意が必要です。
C#string text = null;
bool result = text.Contains("C#"); // エラー
このコードは、textがnullのため、NullReferenceExceptionが発生します。
安全に検索するには、string.IsNullOrEmptyを使います。
C#string text = null;
if (!string.IsNullOrEmpty(text) && text.Contains("C#"))
{
Console.WriteLine("C#が含まれています");
}
else
{
Console.WriteLine("検索できない、または見つかりませんでした");
}
空白だけの文字列も未入力として扱いたい場合は、string.IsNullOrWhiteSpaceを使います。
C#string keyword = " ";
if (string.IsNullOrWhiteSpace(keyword))
{
Console.WriteLine("検索キーワードが未入力です");
}
検索機能では、ユーザーが何も入力しないケースもよくあります。null、空文字、空白文字を適切にチェックすることで、エラーを防ぎやすくなります。
3. C#で配列を検索する方法
配列は、同じ型のデータをまとめて扱うための基本的なデータ構造です。C#で配列を検索する場合は、Array.IndexOf、Array.Exists、Array.Find、Array.FindAllなどを使います。
C#int[] numbers = { 10, 20, 30, 40, 50 };
このような配列から、特定の値や条件に合う要素を検索できます。
3-1. Array.IndexOfで要素の位置を検索する
Array.IndexOfは、配列の中から指定した要素を探し、そのインデックスを返します。
C#int[] numbers = { 10, 20, 30, 40, 50 };
int index = Array.IndexOf(numbers, 30);
Console.WriteLine(index); // 2
要素が見つからない場合は-1が返ります。
C#int[] numbers = { 10, 20, 30 };
int index = Array.IndexOf(numbers, 100);
if (index == -1)
{
Console.WriteLine("見つかりませんでした");
}
文字列配列でも同じように使えます。
C#string[] fruits = { "Apple", "Banana", "Orange" };
int index = Array.IndexOf(fruits, "Banana");
Console.WriteLine(index); // 1
Array.IndexOfは、完全一致で要素の位置を調べたいときに便利です。
3-2. Array.Existsで条件に一致する要素があるか判定する
Array.Existsは、条件に一致する要素が配列内に存在するかを判定します。
C#int[] numbers = { 10, 20, 30, 40, 50 };
bool exists = Array.Exists(numbers, n => n >= 30);
Console.WriteLine(exists); // True
n => n >= 30の部分はラムダ式と呼ばれます。配列の各要素をnとして受け取り、条件に合うかを判定しています。
文字列配列でも使えます。
C#string[] names = { "田中", "佐藤", "鈴木" };
bool exists = Array.Exists(names, name => name.Contains("田"));
Console.WriteLine(exists); // True
Array.Existsは、「条件に合うデータが1つでもあるか」を知りたい場合に向いています。
3-3. Array.Findで条件に一致する最初の要素を取得する
Array.Findは、条件に一致する最初の要素を取得します。
C#int[] numbers = { 10, 20, 30, 40, 50 };
int result = Array.Find(numbers, n => n >= 30);
Console.WriteLine(result); // 30
条件に一致する要素が複数あっても、返されるのは最初の1件だけです。
C#string[] names = { "田中太郎", "佐藤花子", "田村一郎" };
string result = Array.Find(names, name => name.StartsWith("田"));
Console.WriteLine(result); // 田中太郎
見つからなかった場合は、その型の既定値が返ります。intなら0、stringならnullです。
C#string[] names = { "田中", "佐藤" };
string result = Array.Find(names, name => name == "鈴木");
if (result == null)
{
Console.WriteLine("見つかりませんでした");
}
Array.Findは、条件に一致する最初のデータだけが必要な場合に使います。
3-4. Array.FindAllで条件に一致する複数の要素を取得する
Array.FindAllは、条件に一致するすべての要素を配列として取得します。
C#int[] numbers = { 10, 20, 30, 40, 50 };
int[] results = Array.FindAll(numbers, n => n >= 30);
foreach (int n in results)
{
Console.WriteLine(n);
}
実行結果は次のようになります。
30
40
50
文字列の部分一致検索にも使えます。
C#string[] products = { "C#入門", "Java入門", "C#実践", "Python基礎" };
string[] results = Array.FindAll(products, p => p.Contains("C#"));
foreach (string product in results)
{
Console.WriteLine(product);
}
結果は次のとおりです。
C#入門
C#実践
Array.FindAllは、検索結果を一覧表示したい場合に便利です。
3-5. foreachで配列を検索する基本パターン
C#の検索メソッドを使わずに、foreachで配列を検索することもできます。
C#int[] numbers = { 10, 20, 30, 40, 50 };
foreach (int n in numbers)
{
if (n >= 30)
{
Console.WriteLine(n);
}
}
foreachを使うと、検索条件だけでなく、見つかったときの処理を自由に書けます。
C#string[] names = { "田中", "佐藤", "鈴木" };
string keyword = "田";
foreach (string name in names)
{
if (name.Contains(keyword))
{
Console.WriteLine($"{name} が見つかりました");
}
}
初心者のうちは、foreachで検索の流れを理解してから、Array.FindやLINQを使うと理解しやすくなります。
4. C#でListを検索する方法
List<T>は、配列よりも柔軟にデータを追加・削除できるコレクションです。C#でアプリケーションを作る場合、配列よりListを使う場面も多くあります。
Listの検索では、Contains、IndexOf、Find、FindAllなどがよく使われます。
C#List<string> names = new List<string> { "田中", "佐藤", "鈴木" };
4-1. List.Containsで要素が存在するか調べる
List.Containsは、Listの中に指定した要素が存在するかを調べます。
C#List<string> names = new List<string> { "田中", "佐藤", "鈴木" };
bool exists = names.Contains("佐藤");
Console.WriteLine(exists); // True
数値のListでも使えます。
C#List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };
bool exists = numbers.Contains(3);
Console.WriteLine(exists); // True
Containsは完全一致で検索します。部分一致検索をしたい場合は、FindやWhereを使います。
C#List<string> titles = new List<string> { "C#入門", "Java入門", "C#検索" };
bool exists = titles.Any(title => title.Contains("C#"));
Console.WriteLine(exists); // True
4-2. List.IndexOfで要素のインデックスを取得する
List.IndexOfは、指定した要素のインデックスを取得します。
C#List<string> names = new List<string> { "田中", "佐藤", "鈴木" };
int index = names.IndexOf("鈴木");
Console.WriteLine(index); // 2
見つからない場合は-1が返ります。
C#List<string> names = new List<string> { "田中", "佐藤" };
int index = names.IndexOf("山田");
if (index == -1)
{
Console.WriteLine("見つかりませんでした");
}
IndexOfは、検索した要素の位置を使って更新や削除をしたいときに便利です。
C#List<string> names = new List<string> { "田中", "佐藤", "鈴木" };
int index = names.IndexOf("佐藤");
if (index != -1)
{
names[index] = "佐藤花子";
}
4-3. List.Findで条件に一致する要素を取得する
List.Findは、条件に一致する最初の要素を取得します。
C#List<int> numbers = new List<int> { 10, 20, 30, 40 };
int result = numbers.Find(n => n >= 25);
Console.WriteLine(result); // 30
文字列の部分一致検索もできます。
C#List<string> titles = new List<string>
{
"C#入門",
"Java入門",
"C#検索機能"
};
string result = titles.Find(title => title.Contains("検索"));
Console.WriteLine(result); // C#検索機能
見つからなかった場合は、型の既定値が返ります。参照型であるstringの場合はnullです。
C#string result = titles.Find(title => title.Contains("Python"));
if (result == null)
{
Console.WriteLine("見つかりませんでした");
}
List.Findは、最初の1件だけ取得したい場合に使います。
4-4. List.FindAllで複数条件に合う要素を取得する
List.FindAllは、条件に一致するすべての要素をListとして取得します。
C#List<int> numbers = new List<int> { 10, 20, 30, 40, 50 };
List<int> results = numbers.FindAll(n => n >= 30);
foreach (int n in results)
{
Console.WriteLine(n);
}
複数条件を指定することもできます。
C#List<int> numbers = new List<int> { 10, 20, 30, 40, 50 };
List<int> results = numbers.FindAll(n => n >= 20 && n <= 40);
foreach (int n in results)
{
Console.WriteLine(n);
}
文字列の場合は、部分一致や前方一致を組み合わせられます。
C#List<string> products = new List<string>
{
"C#入門",
"C#実践",
"Java入門",
"Python基礎"
};
List<string> results = products.FindAll(p => p.Contains("C#"));
foreach (string product in results)
{
Console.WriteLine(product);
}
検索結果を複数件扱いたい場合は、FindAllまたはLINQのWhereを使うのが一般的です。
4-5. 自作クラスのListを検索する方法
実務では、文字列や数値だけでなく、自作クラスのListを検索することがよくあります。
まず、ユーザー情報を表すクラスを用意します。
C#class User
{
public int Id { get; set; }
public string Name { get; set; } = "";
public int Age { get; set; }
}
このクラスのListを作ります。
C#List<User> users = new List<User>
{
new User { Id = 1, Name = "田中太郎", Age = 25 },
new User { Id = 2, Name = "佐藤花子", Age = 30 },
new User { Id = 3, Name = "鈴木一郎", Age = 20 }
};
名前で検索する場合は、次のように書けます。
C#User? user = users.Find(u => u.Name == "佐藤花子");
if (user != null)
{
Console.WriteLine($"{user.Id}: {user.Name}");
}
年齢で検索する場合は、次のように書けます。
C#List<User> results = users.FindAll(u => u.Age >= 25);
foreach (User user in results)
{
Console.WriteLine($"{user.Name} - {user.Age}歳");
}
自作クラスのListでは、u => u.Name == "佐藤花子"のように、プロパティを指定して検索します。
5. C#でLINQを使って検索する方法
C#で検索処理を柔軟に書きたい場合は、LINQを使うのがおすすめです。LINQを使うと、配列やListに対して、条件指定、並び替え、件数取得、最初の1件取得などを簡潔に書けます。
LINQを使うには、通常はファイルの先頭に次の名前空間を追加します。
C#using System.Linq;
最近のC#プロジェクトでは、暗黙的に利用できる場合もありますが、LINQが使えない場合はusing System.Linq;を確認しましょう。
5-1. LINQとは何かを初心者向けに解説
LINQは、「Language Integrated Query」の略で、C#の中でデータを検索・抽出・加工するための機能です。
たとえば、Listから20歳以上のユーザーだけを検索する処理は、LINQを使うと次のように書けます。
C#var results = users.Where(user => user.Age >= 20);
Whereの中に検索条件を書くだけで、条件に一致するデータを絞り込めます。
LINQのメリットは、検索条件が読みやすく、複数の処理をつなげて書けることです。
C#var results = users
.Where(user => user.Age >= 20)
.OrderBy(user => user.Name);
この例では、20歳以上のユーザーを検索し、名前順に並び替えています。
5-2. Whereで条件に一致するデータを絞り込む
Whereは、条件に一致するデータを絞り込むためのメソッドです。
C#List<int> numbers = new List<int> { 10, 20, 30, 40, 50 };
var results = numbers.Where(n => n >= 30);
foreach (int n in results)
{
Console.WriteLine(n);
}
実行結果は次のとおりです。
30
40
50
文字列の検索にも使えます。
C#List<string> titles = new List<string>
{
"C#入門",
"Java入門",
"C#検索機能",
"Python基礎"
};
var results = titles.Where(title => title.Contains("C#"));
foreach (string title in results)
{
Console.WriteLine(title);
}
Whereは複数件の検索結果を扱うときに便利です。
5-3. First・FirstOrDefaultで最初の要素を取得する
Firstは、条件に一致する最初の要素を取得します。
C#List<int> numbers = new List<int> { 10, 20, 30, 40 };
int result = numbers.First(n => n >= 20);
Console.WriteLine(result); // 20
ただし、条件に一致する要素がない場合、Firstは例外を発生させます。
C#List<int> numbers = new List<int> { 10, 20, 30 };
int result = numbers.First(n => n >= 100); // エラー
検索結果が見つからない可能性がある場合は、FirstOrDefaultを使います。
C#List<string> names = new List<string> { "田中", "佐藤" };
string? result = names.FirstOrDefault(name => name == "鈴木");
if (result == null)
{
Console.WriteLine("見つかりませんでした");
}
初心者のうちは、検索結果がない可能性がある場合はFirstOrDefaultを使うと安全です。
5-4. Single・SingleOrDefaultを使うべきケース
Singleは、条件に一致する要素が1件だけであることを前提に取得するメソッドです。
C#List<User> users = new List<User>
{
new User { Id = 1, Name = "田中", Age = 25 },
new User { Id = 2, Name = "佐藤", Age = 30 }
};
User user = users.Single(u => u.Id == 1);
Console.WriteLine(user.Name);
Singleは、条件に一致する要素が0件でも2件以上でも例外になります。
SingleOrDefaultは、0件の場合に既定値を返しますが、2件以上ある場合は例外になります。
C#User? user = users.SingleOrDefault(u => u.Id == 1);
if (user != null)
{
Console.WriteLine(user.Name);
}
SingleやSingleOrDefaultは、IDやメールアドレスのように「本来1件だけ存在するはず」のデータを検索するときに使います。
C#User? user = users.SingleOrDefault(u => u.Id == 100);
if (user == null)
{
Console.WriteLine("該当するユーザーは存在しません");
}
単に最初の1件が欲しいだけならFirstOrDefault、必ず1件だけであることを確認したいならSingleOrDefaultを使いましょう。
5-5. Anyで条件に一致するデータがあるか判定する
Anyは、条件に一致するデータが1件でも存在するかを判定します。
C#List<int> numbers = new List<int> { 10, 20, 30 };
bool exists = numbers.Any(n => n >= 20);
Console.WriteLine(exists); // True
文字列のListでも使えます。
C#List<string> titles = new List<string>
{
"C#入門",
"Java入門",
"Python基礎"
};
bool exists = titles.Any(title => title.Contains("C#"));
Console.WriteLine(exists); // True
自作クラスのListでは、プロパティを条件に指定できます。
C#bool exists = users.Any(user => user.Age >= 30);
Anyは検索結果そのものが不要で、「存在するかどうか」だけを確認したい場合に向いています。
5-6. Countで検索結果の件数を取得する
Countを使うと、条件に一致する件数を取得できます。
C#List<int> numbers = new List<int> { 10, 20, 30, 40, 50 };
int count = numbers.Count(n => n >= 30);
Console.WriteLine(count); // 3
ユーザー一覧から20歳以上の人数を数える例です。
C#int count = users.Count(user => user.Age >= 20);
Console.WriteLine($"{count}件見つかりました");
検索結果の件数を画面に表示したい場合に便利です。
C#var results = users.Where(user => user.Name.Contains("田中"));
int count = results.Count();
Console.WriteLine($"検索結果: {count}件");
ただし、存在確認だけをしたい場合は、Count() > 0よりもAny()のほうが意図が明確です。
C#bool exists = users.Any(user => user.Name.Contains("田中"));
5-7. 複数条件で検索する方法
LINQでは、AND条件やOR条件を使って複数条件で検索できます。
AND条件は&&を使います。
C#var results = users.Where(user => user.Age >= 20 && user.Age < 30);
この例では、20歳以上かつ30歳未満のユーザーを検索しています。
OR条件は||を使います。
C#var results = users.Where(user => user.Name.Contains("田中") || user.Name.Contains("佐藤"));
この例では、名前に「田中」または「佐藤」を含むユーザーを検索しています。
複数条件を組み合わせることもできます。
C#var results = users.Where(user =>
user.Age >= 20 &&
(user.Name.Contains("田中") || user.Name.Contains("佐藤"))
);
条件が複雑になる場合は、無理に1行で書かず、改行して読みやすくすることが大切です。
6. 検索条件を柔軟にする実装パターン
実際の検索機能では、完全一致だけでなく、部分一致、前方一致、複数条件、未入力時の処理などが必要になります。
たとえば、ユーザーが検索フォームに入力した値をもとに、名前、年齢、登録日などを組み合わせて検索するケースです。
ここでは、C#で検索条件を柔軟にするための基本パターンを紹介します。
6-1. 完全一致・部分一致・前方一致の違い
完全一致は、検索キーワードと対象の文字列が完全に同じ場合に一致とします。
C#string name = "田中太郎";
bool result = name == "田中太郎"; // True
部分一致は、対象の文字列にキーワードが含まれていれば一致とします。
C#string name = "田中太郎";
bool result = name.Contains("田中"); // True
前方一致は、対象の文字列がキーワードで始まる場合に一致とします。
C#string name = "田中太郎";
bool result = name.StartsWith("田中"); // True
後方一致は、対象の文字列がキーワードで終わる場合に一致とします。
C#string name = "田中太郎";
bool result = name.EndsWith("太郎"); // True
検索機能を作るときは、ユーザーにとってどの一致方法が自然かを考える必要があります。一般的なキーワード検索では、部分一致が使われることが多いです。
6-2. AND条件・OR条件で検索する方法
AND条件は、複数の条件をすべて満たすデータを検索します。
C#var results = users.Where(user =>
user.Age >= 20 &&
user.Name.Contains("田")
);
この例では、20歳以上で、名前に「田」を含むユーザーだけが検索されます。
OR条件は、複数の条件のうち1つでも満たすデータを検索します。
C#var results = users.Where(user =>
user.Name.Contains("田中") ||
user.Name.Contains("佐藤")
);
条件を組み合わせる場合は、かっこを使うと意図が明確になります。
C#var results = users.Where(user =>
user.Age >= 20 &&
(user.Name.Contains("田中") || user.Name.Contains("佐藤"))
);
検索条件が複雑になるほど、読みやすいコードを書くことが重要です。
6-3. 数値・日付・文字列を条件に検索する方法
数値を条件に検索する場合は、比較演算子を使います。
C#var results = users.Where(user => user.Age >= 20);
範囲検索もよく使われます。
C#var results = users.Where(user => user.Age >= 20 && user.Age <= 30);
日付を条件に検索する場合は、DateTimeを使います。
C#class Order
{
public int Id { get; set; }
public DateTime OrderedAt { get; set; }
public decimal Amount { get; set; }
}
指定日以降の注文を検索する例です。
C#DateTime fromDate = new DateTime(2026, 1, 1);
var results = orders.Where(order => order.OrderedAt >= fromDate);
文字列を条件に検索する場合は、Contains、StartsWith、EndsWithなどを使います。
C#var results = users.Where(user => user.Name.Contains("田中"));
このように、データ型に合わせて検索条件の書き方を変えます。
6-4. ユーザー入力をもとに検索する方法
コンソールアプリで、ユーザーが入力したキーワードをもとに検索する例を見てみましょう。
C#List<string> titles = new List<string>
{
"C#入門",
"C#検索機能",
"Java入門",
"Python基礎"
};
Console.Write("検索キーワードを入力してください: ");
string? keyword = Console.ReadLine();
if (!string.IsNullOrWhiteSpace(keyword))
{
var results = titles.Where(title =>
title.Contains(keyword, StringComparison.OrdinalIgnoreCase)
);
foreach (string title in results)
{
Console.WriteLine(title);
}
}
else
{
Console.WriteLine("キーワードが入力されていません");
}
ユーザー入力を使う場合は、nullや空文字のチェックが重要です。
C#if (string.IsNullOrWhiteSpace(keyword))
{
Console.WriteLine("検索キーワードを入力してください");
}
また、大文字・小文字を区別しない検索にしたい場合は、StringComparison.OrdinalIgnoreCaseを指定しましょう。
6-5. 検索条件が未入力のときの処理
検索フォームや入力欄では、条件が未入力のまま検索されることがあります。この場合の処理方針は主に2つです。
1つ目は、未入力ならすべてのデータを表示する方法です。
C#IEnumerable<User> results = users;
if (!string.IsNullOrWhiteSpace(keyword))
{
results = results.Where(user => user.Name.Contains(keyword));
}
2つ目は、未入力なら検索しない方法です。
C#if (string.IsNullOrWhiteSpace(keyword))
{
Console.WriteLine("検索キーワードを入力してください");
return;
}
どちらが正しいかは、アプリケーションの仕様によります。
一覧画面では「未入力なら全件表示」が自然な場合があります。一方、検索専用画面では「未入力ならメッセージを表示」のほうが分かりやすい場合もあります。
7. 実践例:C#で簡単な検索機能を作ってみよう
ここでは、C#で簡単なユーザー検索機能を作ってみます。
名前、年齢、IDを条件に検索し、結果を一覧表示するサンプルです。
7-1. サンプルデータを用意する
まず、ユーザー情報を表すクラスを作成します。
C#class User
{
public int Id { get; set; }
public string Name { get; set; } = "";
public int Age { get; set; }
}
次に、検索対象となるサンプルデータを用意します。
C#List<User> users = new List<User>
{
new User { Id = 1, Name = "田中太郎", Age = 25 },
new User { Id = 2, Name = "佐藤花子", Age = 30 },
new User { Id = 3, Name = "鈴木一郎", Age = 19 },
new User { Id = 4, Name = "田村健", Age = 35 },
new User { Id = 5, Name = "山田美咲", Age = 28 }
};
このListに対して、さまざまな条件で検索していきます。
7-2. 名前で検索する
名前に特定のキーワードを含むユーザーを検索します。
C#string keyword = "田";
var results = users.Where(user =>
user.Name.Contains(keyword)
);
foreach (User user in results)
{
Console.WriteLine($"{user.Id}: {user.Name} - {user.Age}歳");
}
実行結果は次のようになります。
1: 田中太郎 - 25歳
4: 田村健 - 35歳
5: 山田美咲 - 28歳
このように、Containsを使うと部分一致検索ができます。
大文字・小文字を区別しない検索をしたい場合は、次のように書きます。
C#string keyword = "tanaka";
var results = users.Where(user =>
user.Name.Contains(keyword, StringComparison.OrdinalIgnoreCase)
);
日本語では大文字・小文字の影響は少ないですが、英数字を含む名前やコードを検索する場合には役立ちます。
7-3. 年齢やIDで検索する
年齢で検索する場合は、比較演算子を使います。
C#var results = users.Where(user => user.Age >= 25);
foreach (User user in results)
{
Console.WriteLine($"{user.Name} - {user.Age}歳");
}
IDで1件検索する場合は、FirstOrDefaultが便利です。
C#int id = 3;
User? user = users.FirstOrDefault(u => u.Id == id);
if (user != null)
{
Console.WriteLine($"{user.Id}: {user.Name}");
}
else
{
Console.WriteLine("該当するユーザーは見つかりませんでした");
}
IDが一意であることを確認したい場合は、SingleOrDefaultを使う選択肢もあります。
C#User? user = users.SingleOrDefault(u => u.Id == id);
ただし、同じIDのデータが複数あると例外になるため、データの一意性が保証されている場合に使いましょう。
7-4. 複数条件で検索する
名前と年齢を組み合わせて検索する例です。
C#string keyword = "田";
int minAge = 25;
var results = users.Where(user =>
user.Name.Contains(keyword) &&
user.Age >= minAge
);
foreach (User user in results)
{
Console.WriteLine($"{user.Id}: {user.Name} - {user.Age}歳");
}
条件が未入力の場合に対応するには、次のように段階的に絞り込みます。
C#string? keyword = "田";
int? minAge = 25;
IEnumerable<User> results = users;
if (!string.IsNullOrWhiteSpace(keyword))
{
results = results.Where(user => user.Name.Contains(keyword));
}
if (minAge.HasValue)
{
results = results.Where(user => user.Age >= minAge.Value);
}
この書き方にすると、検索条件が増えても対応しやすくなります。
C#foreach (User user in results)
{
Console.WriteLine($"{user.Id}: {user.Name} - {user.Age}歳");
}
実際の検索画面では、名前、年齢、登録日、ステータスなど、複数の条件を組み合わせることが多いため、このパターンを覚えておくと便利です。
7-5. 検索結果を一覧表示する
検索結果を一覧表示する場合は、検索結果が0件のケースも考慮します。
C#var results = users
.Where(user => user.Age >= 25)
.ToList();
if (results.Count == 0)
{
Console.WriteLine("検索結果は0件です");
}
else
{
Console.WriteLine($"検索結果: {results.Count}件");
foreach (User user in results)
{
Console.WriteLine($"{user.Id}: {user.Name} - {user.Age}歳");
}
}
ToListを使うことで、検索結果をListとして確定できます。
画面表示や件数表示を行う場合は、検索結果を一度ToListにしておくと扱いやすくなります。
8. C#の検索処理でよくあるエラーと対処法
C#で検索処理を書くときは、戻り値やnull、LINQの使い方に注意が必要です。
初心者がつまずきやすいポイントを押さえておくと、エラーを減らせます。
8-1. 検索結果が見つからないときの戻り値に注意する
検索メソッドは、見つからなかったときの戻り値がそれぞれ異なります。
C#string text = "C#入門";
int index = text.IndexOf("Java");
Console.WriteLine(index); // -1
IndexOfは、見つからないと-1を返します。
C#List<string> names = new List<string> { "田中", "佐藤" };
string? result = names.Find(name => name == "鈴木");
Console.WriteLine(result == null); // True
FindやFirstOrDefaultは、参照型の場合、見つからないとnullを返します。
C#List<int> numbers = new List<int> { 10, 20, 30 };
int result = numbers.FirstOrDefault(n => n > 100);
Console.WriteLine(result); // 0
値型の場合は、既定値が返ります。intなら0です。そのため、0が有効な値として存在する場合は注意が必要です。
8-2. null参照エラーを防ぐ方法
検索対象や検索結果がnullになる可能性がある場合は、必ずチェックしましょう。
C#string? name = null;
if (name != null && name.Contains("田中"))
{
Console.WriteLine("見つかりました");
}
より簡潔に書くなら、null条件演算子を使えます。
C#string? name = null;
bool result = name?.Contains("田中") == true;
Console.WriteLine(result); // False
検索結果を使う場合も、nullチェックが必要です。
C#User? user = users.FirstOrDefault(u => u.Id == 10);
if (user != null)
{
Console.WriteLine(user.Name);
}
else
{
Console.WriteLine("ユーザーが見つかりません");
}
FirstOrDefaultやFindを使ったあとは、検索結果が存在する前提でプロパティにアクセスしないようにしましょう。
8-3. FirstとFirstOrDefaultの使い分けミス
Firstは、条件に一致する要素がない場合に例外を発生させます。
C#List<string> names = new List<string> { "田中", "佐藤" };
string result = names.First(name => name == "鈴木"); // エラー
検索結果がない可能性がある場合は、FirstOrDefaultを使います。
C#string? result = names.FirstOrDefault(name => name == "鈴木");
if (result == null)
{
Console.WriteLine("見つかりませんでした");
}
Firstを使うのは、「必ず1件以上存在する」と分かっている場合に限定しましょう。
C#string firstName = names.First();
データが空になる可能性がある場合は、引数なしのFirstも例外になるため注意が必要です。
C#string? firstName = names.FirstOrDefault();
8-4. 大文字・小文字や全角・半角で検索結果が変わる原因
文字列検索では、大文字・小文字、全角・半角、ひらがな・カタカナなどの違いで検索結果が変わることがあります。
たとえば、通常の検索では大文字・小文字が区別されます。
C#string text = "CSharp";
Console.WriteLine(text.Contains("csharp")); // False
大文字・小文字を区別しない場合は、StringComparison.OrdinalIgnoreCaseを指定します。
C#bool result = text.Contains("csharp", StringComparison.OrdinalIgnoreCase);
全角・半角や表記ゆれに対応したい場合は、検索前に文字列を正規化する方法があります。
C#string keyword = "C#";
string target = "C#検索";
string normalizedKeyword = keyword.Normalize();
string normalizedTarget = target.Normalize();
bool result = normalizedTarget.Contains(normalizedKeyword);
ただし、全角・半角やかな表記の完全な曖昧検索は、単純なContainsだけでは難しい場合があります。必要に応じて、入力値の変換処理や専用の検索ロジックを検討しましょう。
8-5. LINQの遅延実行でつまずくポイント
LINQのWhereは、書いた時点ではすぐに検索が実行されません。実際にforeachで列挙したり、ToListを呼び出したりしたときに実行されます。
C#List<int> numbers = new List<int> { 1, 2, 3 };
var results = numbers.Where(n => n >= 2);
numbers.Add(4);
foreach (int n in results)
{
Console.WriteLine(n);
}
この結果は次のようになります。
2
3
4
resultsを作ったあとに追加した4も含まれます。これはLINQが遅延実行されるためです。
検索した時点の結果を固定したい場合は、ToListを使います。
C#var results = numbers.Where(n => n >= 2).ToList();
numbers.Add(4);
foreach (int n in results)
{
Console.WriteLine(n);
}
この場合、4は検索結果に含まれません。
検索結果を後で何度も使う場合や、件数を表示する場合は、ToListで確定しておくと分かりやすくなります。
9. C#の検索方法の使い分け
C#にはさまざまな検索方法がありますが、目的によって使い分ければ難しくありません。
ここでは、文字列、配列、List、LINQのどれを使うべきかを整理します。
9-1. 文字列検索に向いているメソッド
文字列検索では、次のメソッドを使い分けます。
| メソッド | 向いているケース |
|---|---|
Contains | 指定した文字列が含まれるか知りたい |
IndexOf | 指定した文字列の位置を知りたい |
StartsWith | 前方一致を判定したい |
EndsWith | 後方一致を判定したい |
単純に含まれるかどうかを調べるなら、Containsが最も分かりやすいです。
C#if (text.Contains("検索"))
{
Console.WriteLine("検索という文字が含まれています");
}
位置が必要な場合は、IndexOfを使います。
C#int index = text.IndexOf("検索");
ファイル名やコードの判定には、StartsWithやEndsWithが向いています。
9-2. 配列検索に向いているメソッド
配列検索では、Arrayクラスのメソッドが使えます。
| メソッド | 向いているケース |
|---|---|
Array.IndexOf | 完全一致する要素の位置を知りたい |
Array.Exists | 条件に合う要素が存在するか知りたい |
Array.Find | 条件に合う最初の要素を取得したい |
Array.FindAll | 条件に合う複数の要素を取得したい |
配列で要素の位置を調べたい場合は、Array.IndexOfを使います。
C#int index = Array.IndexOf(numbers, 30);
条件に合うデータを検索したい場合は、Array.FindやArray.FindAllを使います。
C#int result = Array.Find(numbers, n => n >= 30);
9-3. List検索に向いているメソッド
List検索では、List<T>のメソッドが使えます。
| メソッド | 向いているケース |
|---|---|
Contains | 指定した要素があるか調べたい |
IndexOf | 要素の位置を知りたい |
Find | 条件に一致する最初の要素を取得したい |
FindAll | 条件に一致するすべての要素を取得したい |
Listは実務でもよく使われるため、FindとFindAllは覚えておくと便利です。
C#User? user = users.Find(u => u.Id == 1);
C#List<User> results = users.FindAll(u => u.Age >= 20);
ただし、複雑な検索条件や並び替えを組み合わせる場合は、LINQのほうが読みやすくなります。
9-4. LINQを使うべきケース
LINQは、次のようなケースに向いています。
| ケース | 使うメソッド |
|---|---|
| 条件に合うデータを絞り込みたい | Where |
| 最初の1件を取得したい | FirstOrDefault |
| 1件だけ存在する前提で取得したい | SingleOrDefault |
| 存在確認をしたい | Any |
| 件数を取得したい | Count |
| 並び替えたい | OrderBy |
たとえば、検索して並び替える処理はLINQで簡潔に書けます。
C#var results = users
.Where(user => user.Age >= 20)
.OrderBy(user => user.Name)
.ToList();
複数条件で検索する場合も、LINQは読みやすくなります。
C#var results = users.Where(user =>
user.Age >= 20 &&
user.Name.Contains("田")
);
配列やListに対して柔軟な検索をしたい場合は、LINQを選ぶとよいでしょう。
9-5. 初心者におすすめの選び方
初心者の方は、次の基準で選ぶと分かりやすいです。
| やりたいこと | おすすめ |
|---|---|
| 文字列に含まれるか調べたい | Contains |
| 文字列の位置を知りたい | IndexOf |
| 配列から完全一致で探したい | Array.IndexOf |
| Listから最初の1件を探したい | Find |
| Listから複数件を探したい | FindAll |
| 複雑な条件で検索したい | LINQのWhere |
| 存在確認だけしたい | Any |
| 件数を知りたい | Count |
最初はContains、Find、Where、FirstOrDefault、Anyを優先して覚えるのがおすすめです。
C#の検索処理では、「1件ほしいのか」「複数件ほしいのか」「存在確認だけでよいのか」を考えると、使うメソッドを選びやすくなります。
10. C#の検索処理を効率化するコツ
検索処理は、データ件数が少ないうちはあまり問題になりません。しかし、データが多くなると、検索速度やメモリ使用量にも注意が必要です。
ここでは、C#の検索処理を効率化するための基本的な考え方を紹介します。
10-1. データ件数が多いときの注意点
Listや配列をWhereやFindで検索する場合、基本的には先頭から順番に要素を調べます。
C#User? user = users.FirstOrDefault(u => u.Id == 1000);
データ件数が少なければ問題ありませんが、数十万件、数百万件のデータを何度も検索する場合は、処理時間が長くなる可能性があります。
特に、同じ条件で何度も検索する場合は注意が必要です。
C#foreach (int id in targetIds)
{
User? user = users.FirstOrDefault(u => u.Id == id);
}
このような処理では、毎回Listを先頭から検索するため、データ件数が多いと非効率になります。
大量データを扱う場合は、検索しやすいデータ構造を使うことを検討しましょう。
10-2. Dictionaryを使った高速検索
IDやコードで高速に検索したい場合は、Dictionary<TKey, TValue>が便利です。
C#Dictionary<int, User> userDictionary = users.ToDictionary(user => user.Id);
IDをキーにして検索できます。
C#int id = 3;
if (userDictionary.TryGetValue(id, out User? user))
{
Console.WriteLine(user.Name);
}
else
{
Console.WriteLine("見つかりませんでした");
}
Listを毎回検索する場合と比べて、Dictionaryはキーによる検索が高速です。
たとえば、ユーザーID、商品コード、注文番号など、一意のキーで検索する場合に向いています。
C#Dictionary<string, string> products = new Dictionary<string, string>
{
{ "A001", "ノートPC" },
{ "A002", "マウス" },
{ "A003", "キーボード" }
};
if (products.TryGetValue("A002", out string? productName))
{
Console.WriteLine(productName); // マウス
}
ただし、Dictionaryは部分一致検索には向いていません。部分一致や複数条件検索には、LINQや専用の検索処理を使います。
10-3. ToListやToArrayを使うタイミング
LINQの検索結果は、必要になるまで実行されないことがあります。これを遅延実行といいます。
検索結果をその場で確定したい場合は、ToListやToArrayを使います。
C#List<User> results = users
.Where(user => user.Age >= 20)
.ToList();
配列として取得したい場合は、ToArrayを使います。
C#User[] results = users
.Where(user => user.Age >= 20)
.ToArray();
ToListやToArrayを使うと、検索結果がメモリ上に作成されます。そのため、データ件数が非常に多い場合は使いすぎに注意しましょう。
次のように、1回だけループするならToListしなくても問題ありません。
C#foreach (User user in users.Where(u => u.Age >= 20))
{
Console.WriteLine(user.Name);
}
一方で、検索結果の件数を表示したり、何度も使ったりする場合は、ToListしておくと分かりやすくなります。
C#var results = users.Where(u => u.Age >= 20).ToList();
Console.WriteLine($"{results.Count}件見つかりました");
foreach (User user in results)
{
Console.WriteLine(user.Name);
}
10-4. 読みやすい検索コードを書くためのポイント
検索条件が複雑になると、コードが読みにくくなりがちです。
読みにくい例です。
C#var results = users.Where(u => u.Age >= 20 && u.Age <= 30 && u.Name.Contains("田") && u.Id > 0);
条件が多い場合は、改行して書くと読みやすくなります。
C#var results = users.Where(user =>
user.Age >= 20 &&
user.Age <= 30 &&
user.Name.Contains("田") &&
user.Id > 0
);
さらに、条件をメソッドに分ける方法もあります。
C#bool IsMatch(User user, string keyword, int minAge)
{
return user.Name.Contains(keyword) && user.Age >= minAge;
}
var results = users.Where(user => IsMatch(user, "田", 20));
検索条件が増えるほど、「何を検索しているのか」が伝わるコードを書くことが大切です。
変数名も重要です。
C#var adultUsers = users.Where(user => user.Age >= 20);
var matchedUsers = users.Where(user => user.Name.Contains("田中"));
resultsだけでも動作しますが、意味のある名前を付けると、後から見たときに理解しやすくなります。
11. C#の検索機能に関するよくある質問
ここでは、C#の検索機能で初心者が疑問に思いやすいポイントをQ&A形式で解説します。
11-1. ContainsとIndexOfの違いは何ですか?
Containsは、指定した文字列や要素が含まれているかをtrueまたはfalseで返します。
C#string text = "C#検索";
bool result = text.Contains("検索");
Console.WriteLine(result); // True
IndexOfは、指定した文字列や要素が見つかった位置を返します。
C#string text = "C#検索";
int index = text.IndexOf("検索");
Console.WriteLine(index); // 2
見つからない場合、IndexOfは-1を返します。
C#int index = text.IndexOf("Java");
Console.WriteLine(index); // -1
単に存在するかを知りたいならContains、位置を知りたいならIndexOfを使いましょう。
11-2. FindとWhereの違いは何ですか?
Findは、条件に一致する最初の1件を取得します。
C#User? user = users.Find(u => u.Age >= 20);
Whereは、条件に一致する複数の要素を取得します。
C#var results = users.Where(u => u.Age >= 20);
最初の1件だけ必要ならFind、複数件の検索結果を扱いたいならWhereを使います。
また、Findは主にList<T>で使うメソッドです。一方、WhereはLINQのメソッドで、Listだけでなく配列などにも使えます。
C#int[] numbers = { 1, 2, 3, 4, 5 };
var results = numbers.Where(n => n >= 3);
柔軟な検索をしたい場合は、LINQのWhereを使う場面が多いです。
11-3. FirstOrDefaultでnullが返るのはなぜですか?
FirstOrDefaultは、条件に一致する要素が見つからない場合に既定値を返します。
参照型の場合、既定値はnullです。
C#List<string> names = new List<string> { "田中", "佐藤" };
string? result = names.FirstOrDefault(name => name == "鈴木");
Console.WriteLine(result == null); // True
そのため、FirstOrDefaultの結果を使う前にはnullチェックを行いましょう。
C#if (result != null)
{
Console.WriteLine(result);
}
else
{
Console.WriteLine("見つかりませんでした");
}
自作クラスの検索でも同じです。
C#User? user = users.FirstOrDefault(u => u.Id == 100);
if (user == null)
{
Console.WriteLine("ユーザーが見つかりません");
}
FirstOrDefaultは安全に検索できる便利なメソッドですが、結果が存在しない場合を必ず考慮する必要があります。
11-4. Listの中にあるクラスのプロパティで検索できますか?
できます。
自作クラスのListでは、ラムダ式でプロパティを指定して検索します。
C#class Product
{
public int Id { get; set; }
public string Name { get; set; } = "";
public int Price { get; set; }
}
商品Listを用意します。
C#List<Product> products = new List<Product>
{
new Product { Id = 1, Name = "ノートPC", Price = 120000 },
new Product { Id = 2, Name = "マウス", Price = 3000 },
new Product { Id = 3, Name = "キーボード", Price = 8000 }
};
名前で検索する例です。
C#var results = products.Where(product => product.Name.Contains("PC"));
価格で検索する例です。
C#var results = products.Where(product => product.Price <= 10000);
IDで1件取得する例です。
C#Product? product = products.FirstOrDefault(p => p.Id == 2);
このように、product.Name、product.Price、product.Idのようにプロパティを指定すれば、Listの中にあるクラスのデータも検索できます。
11-5. C#で曖昧検索はできますか?
簡単な曖昧検索であれば、Containsを使って実装できます。
C#var results = users.Where(user => user.Name.Contains("田"));
大文字・小文字を区別しない検索もできます。
C#var results = users.Where(user =>
user.Name.Contains(keyword, StringComparison.OrdinalIgnoreCase)
);
ただし、「全角・半角を同一視したい」「ひらがなとカタカナを同一視したい」「入力ミスに近い文字も検索したい」といった高度な曖昧検索は、Containsだけでは不十分です。
たとえば、単純な正規化を行ってから検索する方法があります。
C#string NormalizeText(string text)
{
return text.Normalize().ToLowerInvariant();
}
string keyword = NormalizeText("C#");
string target = NormalizeText("C#検索");
bool result = target.Contains(keyword);
より本格的な曖昧検索を実装する場合は、文字列の正規化、読み仮名データの用意、類似度計算、検索エンジンの利用などを検討します。
初心者のうちは、まずContainsによる部分一致検索から始めるのがおすすめです。
まとめ
C#で検索機能を実装する方法は、検索対象によって変わります。
文字列を検索する場合は、Contains、IndexOf、StartsWith、EndsWithを使います。
C#string text = "C#検索";
bool result = text.Contains("検索");
配列を検索する場合は、Array.IndexOf、Array.Exists、Array.Find、Array.FindAllが使えます。
C#int[] numbers = { 10, 20, 30 };
int result = Array.Find(numbers, n => n >= 20);
Listを検索する場合は、Contains、IndexOf、Find、FindAllが便利です。
C#List<string> names = new List<string> { "田中", "佐藤" };
string? result = names.Find(name => name == "田中");
より柔軟な検索をしたい場合は、LINQを使います。
C#var results = users.Where(user => user.Age >= 20);
C#の検索処理では、次の考え方が重要です。
| やりたいこと | 使うメソッド |
|---|---|
| 含まれているか調べたい | Contains |
| 位置を知りたい | IndexOf |
| 最初の1件を取得したい | Find、FirstOrDefault |
| 複数件を取得したい | FindAll、Where |
| 存在確認をしたい | Exists、Any |
| 件数を取得したい | Count |
| 高速にキー検索したい | Dictionary |
初心者の方は、まずContains、Find、Where、FirstOrDefault、Anyを重点的に覚えると、C#の検索機能を実装しやすくなります。
また、検索結果が見つからない場合の戻り値やnull参照エラーにも注意が必要です。ユーザー入力を使う検索では、空文字やnullをチェックし、大文字・小文字の違いも考慮すると、より使いやすい検索機能になります。
C#の検索は、基本を押さえれば文字列検索からList検索、LINQによる複雑な条件検索まで幅広く応用できます。まずは小さなサンプルコードで試しながら、実際のアプリケーションに検索機能を組み込んでみましょう。

