C# string.Containsの使い方完全ガイド|大文字小文字の区別・部分一致・複数条件まで解説

はじめに

C#で文字列の中に特定の文字や単語が含まれているか調べたいときによく使うのが、string.Containsメソッドです。

たとえば、次のような処理で使われます。

C#
string text = "C# string.Containsの使い方を学びます";

bool result = text.Contains("Contains");

Console.WriteLine(result); // True

string.Containsはシンプルなメソッドですが、実際に使うと「大文字小文字は区別されるのか」「複数キーワードを判定するにはどうするのか」「nullの場合はどうなるのか」「IndexOfとの違いは何か」といった疑問が出てきます。

この記事では、C#のstring.Containsの基本から、大文字小文字を無視する方法、複数条件、null対策、List.Containsとの違い、実践的な使い方までまとめて解説します。

1. C#のstring.Containsとは?できることを最初に理解する

1-1. string.Containsは文字列に特定の文字・文字列が含まれるか判定するメソッド

string.Containsは、ある文字列の中に、指定した文字または文字列が含まれているかを調べるためのメソッドです。

Microsoftの公式ドキュメントでも、String.Containsは指定した文字列や文字が対象の文字列内に出現するかどうかを返すメソッドとして説明されています。Microsoft Learn+1

C#
string message = "Hello C#";

bool result = message.Contains("C#");

Console.WriteLine(result); // True

この例では、messageの中に"C#"が含まれているため、結果はtrueになります。

1-2. 戻り値はbool型|含まれていればtrue、なければfalse

Containsの戻り値はbool型です。

つまり、結果は次のどちらかです。

結果意味
true指定した文字列が含まれている
false指定した文字列が含まれていない
C#
string text = "apple banana orange";

Console.WriteLine(text.Contains("banana")); // True
Console.WriteLine(text.Contains("grape")); // False

Containsは「見つかった文字列そのもの」や「位置」を返すわけではありません。あくまで、含まれているかどうかをtrueまたはfalseで返します。

1-3. 完全一致ではなく「部分一致」を判定するメソッド

string.Containsは、完全一致ではなく部分一致を判定するメソッドです。

C#
string text = "programming";

Console.WriteLine(text.Contains("gram")); // True

"programming""gram"は完全には一致していませんが、"programming"の中に"gram"が含まれているため、trueになります。

完全一致を判定したい場合は、ContainsではなくEquals==を使います。

C#
string text = "programming";

Console.WriteLine(text == "gram"); // False
Console.WriteLine(text.Equals("programming")); // True

1-4. Containsがよく使われる場面|検索・入力チェック・フィルタリング

string.Containsは、実務でも非常によく使われます。

代表的な用途は次のとおりです。

用途
検索文章に検索キーワードが含まれるか調べる
入力チェック禁止ワードが含まれていないか確認する
フィルタリング一覧から条件に合うデータだけ抽出する
ログ解析エラーログに特定の文言が含まれるか確認する
ファイル名チェックファイル名に特定の文字列が含まれるか確認する
C#
string log = "ERROR: File not found";

if (log.Contains("ERROR"))
{
Console.WriteLine("エラーが発生しています");
}

このように、Containsは「文字列の中に特定のキーワードがあるか」を調べる場面で便利です。

2. string.Containsの基本的な使い方

2-1. 文字列が含まれているか判定する基本構文

string.Containsの基本構文は次のとおりです。

C#
対象文字列.Contains(検索したい文字列)

例を見てみましょう。

C#
string text = "C# is fun";

bool contains = text.Contains("fun");

Console.WriteLine(contains); // True

textの中に"fun"が含まれているため、containsにはtrueが入ります。

2-2. 文字を1文字だけ検索する使い方

Containsでは、文字列だけでなく1文字の検索もできます。

C#
string text = "abcde";

bool result = text.Contains('c');

Console.WriteLine(result); // True

1文字を指定する場合は、ダブルクォーテーション"ではなく、シングルクォーテーション'を使います。

C#
text.Contains('c');   // char
text.Contains("c"); // string

どちらも似ていますが、'c'char型、"c"string型です。

2-3. if文と組み合わせた実用例

Containsは、if文と組み合わせて使うことが多いです。

C#
string input = "お問い合わせ内容にキャンセルという文字が含まれています";

if (input.Contains("キャンセル"))
{
Console.WriteLine("キャンセル関連の問い合わせです");
}

Containsの結果はbool型なので、そのままif文の条件式として使えます。

C#
if (input.Contains("キャンセル"))
{
// 含まれている場合の処理
}

2-4. 変数に検索キーワードを入れて判定する方法

検索したい文字列は、直接書くだけでなく変数に入れて使えます。

C#
string text = "C# string.Containsを学習中です";
string keyword = "Contains";

if (text.Contains(keyword))
{
Console.WriteLine("キーワードが見つかりました");
}

検索ボックスや設定ファイルなどからキーワードを受け取る場合は、このように変数を使うのが一般的です。

C#
string keyword = Console.ReadLine();

if (text.Contains(keyword))
{
Console.WriteLine("一致する内容があります");
}

ただし、ユーザー入力を使う場合は、空文字やnullにも注意が必要です。これについては後半で詳しく解説します。

2-5. 含まれていない場合の処理を書く方法

含まれていない場合の処理は、!を使って書けます。

C#
string text = "apple banana orange";

if (!text.Contains("grape"))
{
Console.WriteLine("grapeは含まれていません");
}

または、elseを使って分岐することもできます。

C#
string text = "apple banana orange";

if (text.Contains("banana"))
{
Console.WriteLine("bananaが含まれています");
}
else
{
Console.WriteLine("bananaは含まれていません");
}

読みやすさを重視するなら、処理内容に合わせて!を使うかelseを使うかを選びましょう。

3. string.Containsは大文字小文字を区別する?仕様と対処法

3-1. 通常のContainsは大文字小文字を区別する

通常のContainsは、大文字小文字を区別します。

C#
string text = "Hello World";

Console.WriteLine(text.Contains("World")); // True
Console.WriteLine(text.Contains("world")); // False

"World""world"は、大文字のWと小文字のwが異なるため、結果はfalseになります。

C#でstring.Containsを使うときに特に多いミスが、この大文字小文字の違いです。

C#
string email = "USER@example.com";

Console.WriteLine(email.Contains("user")); // False

このような場合、大文字小文字を無視して比較する方法を使います。

3-2. StringComparison.OrdinalIgnoreCaseで大文字小文字を無視する方法

大文字小文字を無視してContainsしたい場合は、StringComparison.OrdinalIgnoreCaseを指定します。

C#
string text = "Hello World";

bool result = text.Contains("world", StringComparison.OrdinalIgnoreCase);

Console.WriteLine(result); // True

StringComparison.OrdinalIgnoreCaseを使うと、大小文字の違いを無視した比較ができます。

C#
string fileName = "Report.PDF";

if (fileName.Contains(".pdf", StringComparison.OrdinalIgnoreCase))
{
Console.WriteLine("PDFファイルです");
}

ファイル名、拡張子、ID、コード値、ログなど、言語的な意味よりも機械的な一致を見たい場面では、OrdinalIgnoreCaseがよく使われます。

3-3. .NET Core/.NET 5以降で使えるContainsのオーバーロード

現在の.NETでは、ContainsStringComparisonを指定できるオーバーロードが用意されています。公式ドキュメントにも、Contains(String, StringComparison)Contains(Char, StringComparison)が掲載されています。Microsoft Learn+1

C#
string text = "CSharp Programming";

bool result = text.Contains("csharp", StringComparison.OrdinalIgnoreCase);

Console.WriteLine(result); // True

この書き方は読みやすく、意図も明確です。

C#
text.Contains("keyword", StringComparison.OrdinalIgnoreCase)

大文字小文字を無視したい場合は、可能であればこの書き方を使うのがおすすめです。

3-4. .NET Frameworkで大文字小文字を無視したい場合はIndexOfを使う

.NET Frameworkでは、Contains(String, StringComparison)が使えない環境があります。その場合は、IndexOfを使って代替できます。

C#
string text = "Hello World";

bool result = text.IndexOf("world", StringComparison.OrdinalIgnoreCase) >= 0;

Console.WriteLine(result); // True

IndexOfは、指定した文字列が見つかった位置を返します。見つからない場合は-1を返すため、>= 0で判定できます。

C#
if (text.IndexOf("world", StringComparison.OrdinalIgnoreCase) >= 0)
{
Console.WriteLine("見つかりました");
}

古い.NET Frameworkを使っている場合は、この方法を覚えておくと便利です。

3-5. ToLower/ToUpperで比較する方法が推奨されにくい理由

大文字小文字を無視するために、次のようなコードを書くこともできます。

C#
string text = "Hello World";

bool result = text.ToLower().Contains("world");

一見わかりやすいですが、この方法はあまり推奨されません。

理由は主に次の3つです。

理由内容
余計な文字列を作るToLowerToUpperで新しい文字列が生成される
カルチャの影響を受ける可能性がある言語や地域によって大小文字変換の挙動が変わる場合がある
意図が曖昧になりやすいどの比較ルールで判定したいのかコードから伝わりにくい

特に、英語以外の文字列や国際化対応が必要なアプリでは、ToLowerToUpperよりもStringComparisonを指定するほうが安全です。Microsoftの文字列比較のベストプラクティスでも、比較の目的に合ったStringComparisonを明示することが推奨されています。Microsoft Learn+1

4. StringComparisonの使い分け|Ordinal・CurrentCulture・InvariantCulture

4-1. StringComparisonとは何か

StringComparisonは、文字列をどのルールで比較するかを指定する列挙型です。

たとえば、次のような指定があります。

C#
StringComparison.Ordinal
StringComparison.OrdinalIgnoreCase
StringComparison.CurrentCulture
StringComparison.CurrentCultureIgnoreCase
StringComparison.InvariantCulture
StringComparison.InvariantCultureIgnoreCase

公式ドキュメントでは、StringComparisonは現在のカルチャ、インバリアントカルチャ、序数比較、大文字小文字の扱いなど、文字列比較のルールを指定するための列挙型として説明されています。Microsoft Learn

4-2. 基本はOrdinalまたはOrdinalIgnoreCaseを選ぶ

多くのプログラムでは、基本的にOrdinalまたはOrdinalIgnoreCaseを選ぶとわかりやすいです。

C#
string text = "AdminUser";

bool result = text.Contains("admin", StringComparison.OrdinalIgnoreCase);

Ordinalは、文字を言語的な意味ではなく、コード値に近い形で比較します。

次のような用途では、Ordinal系が向いています。

用途おすすめ
IDの比較OrdinalまたはOrdinalIgnoreCase
ファイル名の一部判定OrdinalIgnoreCase
URLの判定OrdinalIgnoreCase
ログ文字列の判定OrdinalまたはOrdinalIgnoreCase
設定値の判定OrdinalIgnoreCase

たとえば、ログに"ERROR"が含まれているかを判定する場合は、カルチャ依存の比較よりもOrdinalIgnoreCaseのほうが意図が明確です。

C#
string log = "error: connection failed";

if (log.Contains("ERROR", StringComparison.OrdinalIgnoreCase))
{
Console.WriteLine("エラーです");
}

4-3. ユーザー表示向けの文字列比較ではCurrentCultureを検討する

ユーザーが読む文章や、画面表示に近い文字列を比較する場合は、CurrentCultureCurrentCultureIgnoreCaseを検討します。

C#
string title = "café menu";

bool result = title.Contains("CAFÉ", StringComparison.CurrentCultureIgnoreCase);

CurrentCultureは、現在のカルチャ、つまり実行環境やユーザー設定に応じたルールで比較します。

次のような場面では、CurrentCulture系を検討してもよいでしょう。

用途
ユーザー向け検索記事タイトル、商品名、氏名
画面表示文字列の比較一覧検索、表示名検索
言語ごとの自然な比較ローカライズされた文字列

ただし、常にCurrentCultureを使えばよいわけではありません。ID、コード、ログ、内部処理では、Ordinal系のほうが適しています。

4-4. 日本語・英語・トルコ語などカルチャ差に注意する

文字列比較では、カルチャ差に注意が必要です。

特に有名なのが、トルコ語のIiの問題です。英語圏の感覚では大文字小文字の対応が単純に見えても、カルチャによって変換や比較のルールが異なる場合があります。

そのため、次のように使い分けることが大切です。

C#
// 内部的な識別子やコード値
text.Contains(keyword, StringComparison.OrdinalIgnoreCase);

// ユーザー向けの自然な検索
text.Contains(keyword, StringComparison.CurrentCultureIgnoreCase);

日本語でも、全角・半角、ひらがな・カタカナ、濁点の扱いなど、単純なContainsだけでは期待通りに一致しない場合があります。

C#
string text = "カタカナ";

Console.WriteLine(text.Contains("かたかな")); // False

Containsは便利ですが、日本語の表記ゆれまで自動的に吸収するメソッドではありません。

4-5. 迷ったときのStringComparison選択早見表

迷ったときは、次の表を参考にしてください。

目的おすすめ
大文字小文字を区別して機械的に比較したいStringComparison.Ordinal
大文字小文字を無視して機械的に比較したいStringComparison.OrdinalIgnoreCase
ユーザーの言語・地域に合わせて比較したいStringComparison.CurrentCulture
ユーザーの言語・地域に合わせ、大文字小文字を無視したいStringComparison.CurrentCultureIgnoreCase
カルチャ非依存で言語的な比較をしたいStringComparison.InvariantCulture
カルチャ非依存で大文字小文字を無視したいStringComparison.InvariantCultureIgnoreCase

実務では、まずOrdinalまたはOrdinalIgnoreCaseを候補にし、ユーザー向け検索など必要な場合だけCurrentCulture系を検討するとよいでしょう。

5. 部分一致・前方一致・後方一致の違い

5-1. Containsは部分一致を判定する

Containsは、文字列のどこかに指定した文字列が含まれていればtrueを返します。

C#
string text = "Hello C# World";

Console.WriteLine(text.Contains("C#")); // True
Console.WriteLine(text.Contains("Hello")); // True
Console.WriteLine(text.Contains("World")); // True

先頭にあっても、途中にあっても、末尾にあっても、含まれていればtrueです。

C#
string text = "abcdef";

Console.WriteLine(text.Contains("cd")); // True

このように、Containsは部分一致を判定したいときに使います。

5-2. 前方一致ならStartsWithを使う

文字列が特定の文字列で始まるかを判定したい場合は、StartsWithを使います。

C#
string text = "CSharpTutorial";

Console.WriteLine(text.StartsWith("CSharp")); // True
Console.WriteLine(text.StartsWith("Sharp")); // False

Containsを使っても先頭に含まれるかのような判定はできますが、先頭であることを保証できません。

C#
string text = "MyCSharpTutorial";

Console.WriteLine(text.Contains("CSharp")); // True
Console.WriteLine(text.StartsWith("CSharp")); // False

前方一致をしたい場合は、ContainsではなくStartsWithを使いましょう。

5-3. 後方一致ならEndsWithを使う

文字列が特定の文字列で終わるかを判定したい場合は、EndsWithを使います。

C#
string fileName = "sample.pdf";

Console.WriteLine(fileName.EndsWith(".pdf")); // True

ファイル拡張子の判定では、ContainsよりもEndsWithのほうが適しています。

C#
string fileName = "pdf_sample.txt";

Console.WriteLine(fileName.Contains(".pdf")); // False
Console.WriteLine(fileName.EndsWith(".pdf")); // False

ただし、次のようなケースではContainsだと誤判定する可能性があります。

C#
string fileName = "backup.pdf.txt";

Console.WriteLine(fileName.Contains(".pdf")); // True
Console.WriteLine(fileName.EndsWith(".pdf")); // False

「PDFという文字列を含むか」ではなく「PDFファイルか」を判定したいなら、EndsWithを使うべきです。

5-4. 完全一致ならEqualsまたは==を使う

文字列全体が一致するかどうかを判定したい場合は、Equalsまたは==を使います。

C#
string text = "admin";

Console.WriteLine(text.Contains("adm")); // True
Console.WriteLine(text == "adm"); // False
Console.WriteLine(text.Equals("admin")); // True

Containsは部分一致なので、完全一致の判定には向いていません。

大文字小文字を無視して完全一致したい場合は、EqualsStringComparisonを指定します。

C#
string role = "Admin";

bool result = role.Equals("admin", StringComparison.OrdinalIgnoreCase);

Console.WriteLine(result); // True

5-5. Contains・StartsWith・EndsWith・Equalsの使い分け

文字列比較では、目的に合ったメソッドを選ぶことが重要です。

やりたいこと使うメソッド
どこかに含まれるか調べたいContains
先頭から始まるか調べたいStartsWith
末尾で終わるか調べたいEndsWith
全体が一致するか調べたいEqualsまたは==

例で比較すると、次のようになります。

C#
string text = "CSharpGuide";

Console.WriteLine(text.Contains("Sharp")); // True
Console.WriteLine(text.StartsWith("C")); // True
Console.WriteLine(text.EndsWith("Guide")); // True
Console.WriteLine(text.Equals("CSharpGuide")); // True

Containsは便利ですが、すべての文字列比較に使うものではありません。目的に応じて適切なメソッドを選びましょう。

6. 複数条件でContainsを使う方法

6-1. 複数キーワードのいずれかを含むか判定する

複数のキーワードのうち、どれか1つでも含まれていればよい場合は、||またはLINQのAnyを使います。

まずは||を使う基本例です。

C#
string text = "この商品は送料無料です";

if (text.Contains("無料") || text.Contains("送料無料"))
{
Console.WriteLine("無料に関する文言が含まれています");
}

このコードでは、"無料"または"送料無料"のどちらかが含まれていればtrueになります。

6-2. 複数キーワードをすべて含むか判定する

複数のキーワードをすべて含むか判定したい場合は、&&またはLINQのAllを使います。

C#
string text = "C# string.Containsの使い方";

if (text.Contains("C#") && text.Contains("Contains"))
{
Console.WriteLine("両方のキーワードが含まれています");
}

この場合、"C#""Contains"の両方が含まれている場合だけtrueになります。

6-3. ||と&&で条件を組み合わせる基本例

||は「または」、&&は「かつ」を意味します。

C#
string text = "ERROR: Database connection failed";

if (text.Contains("ERROR") || text.Contains("WARN"))
{
Console.WriteLine("注意が必要なログです");
}
C#
string text = "ERROR: Database connection failed";

if (text.Contains("ERROR") && text.Contains("Database"))
{
Console.WriteLine("データベース関連のエラーです");
}

条件が少ない場合は、||&&で十分です。

ただし、キーワードが増えるとコードが長くなります。

C#
if (text.Contains("ERROR") ||
text.Contains("WARN") ||
text.Contains("FATAL") ||
text.Contains("CRITICAL"))
{
Console.WriteLine("重要なログです");
}

このような場合は、配列やListとLINQを使うとスッキリ書けます。

6-4. Anyを使って複数キーワードを簡潔に判定する

複数キーワードのうち、いずれかを含むか判定するならAnyが便利です。

C#
using System.Linq;

string text = "ERROR: Database connection failed";

string[] keywords = { "ERROR", "WARN", "FATAL" };

bool result = keywords.Any(keyword => text.Contains(keyword));

Console.WriteLine(result); // True

Anyは、条件を満たす要素が1つでもあればtrueを返します。

大文字小文字を無視したい場合は、次のように書きます。

C#
using System;
using System.Linq;

string text = "error: database connection failed";

string[] keywords = { "ERROR", "WARN", "FATAL" };

bool result = keywords.Any(keyword =>
text.Contains(keyword, StringComparison.OrdinalIgnoreCase));

Console.WriteLine(result); // True

6-5. Allを使ってすべてのキーワードを含むか判定する

複数キーワードをすべて含むか判定する場合は、Allを使います。

C#
using System.Linq;

string text = "C# string.Contains tutorial";

string[] keywords = { "C#", "Contains", "tutorial" };

bool result = keywords.All(keyword => text.Contains(keyword));

Console.WriteLine(result); // True

Allは、すべての要素が条件を満たす場合だけtrueを返します。

C#
string[] keywords = { "C#", "Contains", "Java" };

bool result = keywords.All(keyword => text.Contains(keyword));

Console.WriteLine(result); // False

"Java"が含まれていないため、結果はfalseになります。

6-6. 複数条件が増えたときは配列・Listで管理する

キーワードが多い場合は、条件式に直接書くよりも、配列やListで管理したほうが保守しやすくなります。

C#
using System;
using System.Collections.Generic;
using System.Linq;

string text = "この投稿には禁止ワードが含まれています";

List<string> bannedWords = new List<string>
{
"禁止ワード",
"NG",
"スパム"
};

bool hasBannedWord = bannedWords.Any(word =>
text.Contains(word, StringComparison.OrdinalIgnoreCase));

if (hasBannedWord)
{
Console.WriteLine("禁止ワードが含まれています");
}

キーワードの追加・削除が簡単になるため、実務ではこのような書き方がよく使われます。

7. null・空文字・例外に注意する

7-1. 対象文字列がnullだとNullReferenceExceptionになる

Containsを呼び出す対象の文字列がnullの場合、NullReferenceExceptionが発生します。

C#
string text = null;

bool result = text.Contains("test"); // NullReferenceException

Containsはインスタンスメソッドなので、nullに対して呼び出すことはできません。

そのため、対象文字列がnullになる可能性がある場合は、事前にチェックする必要があります。

C#
string text = null;

if (text != null && text.Contains("test"))
{
Console.WriteLine("含まれています");
}

7-2. null条件演算子を使って安全に判定する

null条件演算子?.を使うと、より簡潔に書けます。

C#
string text = null;

bool result = text?.Contains("test") == true;

Console.WriteLine(result); // False

textnullの場合、text?.Contains("test")nullになります。

そのため、== trueを付けることで、trueの場合だけtrueになり、それ以外はfalseになります。

C#
if (text?.Contains("test") == true)
{
Console.WriteLine("含まれています");
}

この書き方は、null安全にContainsを使いたいときに便利です。

7-3. string.IsNullOrEmptyと組み合わせる方法

対象文字列がnullまたは空文字でないことを確認してからContainsする方法もあります。

C#
string text = "";

if (!string.IsNullOrEmpty(text) && text.Contains("test"))
{
Console.WriteLine("含まれています");
}

string.IsNullOrEmptyは、文字列がnullまたは""の場合にtrueを返します。

C#
Console.WriteLine(string.IsNullOrEmpty(null)); // True
Console.WriteLine(string.IsNullOrEmpty("")); // True
Console.WriteLine(string.IsNullOrEmpty("abc")); // False

空文字を検索対象として扱いたくない場合は、IsNullOrEmptyを使うとよいでしょう。

7-4. string.IsNullOrWhiteSpaceと組み合わせる方法

空白だけの文字列も除外したい場合は、string.IsNullOrWhiteSpaceを使います。

C#
string text = "   ";

if (!string.IsNullOrWhiteSpace(text) && text.Contains("test"))
{
Console.WriteLine("含まれています");
}

IsNullOrWhiteSpaceは、次のような値をtrueと判定します。

C#
string.IsNullOrWhiteSpace(null);  // True
string.IsNullOrWhiteSpace(""); // True
string.IsNullOrWhiteSpace(" "); // True

ユーザー入力を扱う場合は、IsNullOrEmptyよりもIsNullOrWhiteSpaceのほうが適していることがあります。

7-5. 検索文字列が空文字の場合の挙動

検索する文字列が空文字""の場合、Containstrueを返します。

C#
string text = "abc";

Console.WriteLine(text.Contains("")); // True

これは、空文字は任意の文字列に含まれると考えられるためです。

ただし、検索機能などでは、空文字を検索キーワードとして扱うと意図しない結果になることがあります。

C#
string keyword = "";

if (text.Contains(keyword))
{
Console.WriteLine("一致しました");
}

この場合、ほぼ常に一致した扱いになってしまいます。

検索キーワードが空文字の場合は、事前にチェックするのがおすすめです。

C#
string keyword = "";

if (!string.IsNullOrWhiteSpace(keyword) &&
text.Contains(keyword, StringComparison.OrdinalIgnoreCase))
{
Console.WriteLine("一致しました");
}

7-6. 安全なContains判定を共通メソッド化する例

nullや空文字に毎回注意するのが面倒な場合は、共通メソッド化すると便利です。

C#
using System;

public static class StringHelper
{
public static bool SafeContains(string source, string keyword)
{
if (string.IsNullOrEmpty(source))
{
return false;
}

if (string.IsNullOrEmpty(keyword))
{
return false;
}

return source.Contains(keyword, StringComparison.OrdinalIgnoreCase);
}
}

使う側はシンプルになります。

C#
string text = null;
string keyword = "test";

bool result = StringHelper.SafeContains(text, keyword);

Console.WriteLine(result); // False

大文字小文字を区別したい場合や、StringComparisonを外から指定したい場合は、次のようにできます。

C#
using System;

public static class StringHelper
{
public static bool SafeContains(
string source,
string keyword,
StringComparison comparisonType = StringComparison.OrdinalIgnoreCase)
{
if (string.IsNullOrEmpty(source) || string.IsNullOrEmpty(keyword))
{
return false;
}

return source.Contains(keyword, comparisonType);
}
}
C#
bool result = StringHelper.SafeContains(
"Hello World",
"world",
StringComparison.OrdinalIgnoreCase);

Console.WriteLine(result); // True

8. string.ContainsとList.Contains/Array.Containsの違い

8-1. string.Containsは文字列内の部分一致を調べる

string.Containsは、文字列の中に指定した文字列が含まれているかを調べます。

C#
string text = "apple banana orange";

bool result = text.Contains("banana");

Console.WriteLine(result); // True

この場合、"apple banana orange"という1つの文字列の中に"banana"が含まれるかを見ています。

つまり、string.Containsは「文字列内の部分一致」を調べるメソッドです。

8-2. List.Containsはリスト内の要素一致を調べる

一方、List.Containsは、リストの中に指定した要素が存在するかを調べます。

C#
using System.Collections.Generic;

List<string> fruits = new List<string>
{
"apple",
"banana",
"orange"
};

bool result = fruits.Contains("banana");

Console.WriteLine(result); // True

これは、リストの要素として"banana"が存在するかを見ています。

部分一致ではありません。

C#
List<string> fruits = new List<string>
{
"apple",
"banana",
"orange"
};

Console.WriteLine(fruits.Contains("ban")); // False

"banana"の中に"ban"は含まれていますが、リストの要素として"ban"は存在しないためfalseになります。

8-3. 配列でContainsを使うにはLINQが必要

配列でContainsを使う場合は、LINQを使います。

C#
using System.Linq;

string[] fruits = { "apple", "banana", "orange" };

bool result = fruits.Contains("banana");

Console.WriteLine(result); // True

using System.Linq;がないと、配列に対するContainsが使えない場合があります。

C#
using System.Linq;

配列のContainsも、基本的には要素一致です。

C#
string[] fruits = { "apple", "banana", "orange" };

Console.WriteLine(fruits.Contains("ban")); // False

部分一致をしたい場合は、Anystring.Containsを組み合わせます。

C#
using System.Linq;

string[] fruits = { "apple", "banana", "orange" };

bool result = fruits.Any(fruit => fruit.Contains("ban"));

Console.WriteLine(result); // True

8-4. 「文字列に含まれる」と「コレクションに含まれる」の違い

Containsという名前は同じでも、対象によって意味が違います。

書き方意味
text.Contains("abc")文字列の中に"abc"が含まれるか
list.Contains("abc")リストの要素に"abc"があるか
array.Contains("abc")配列の要素に"abc"があるか

次の違いを押さえておきましょう。

C#
string text = "banana";
Console.WriteLine(text.Contains("ban")); // True
C#
List<string> list = new List<string> { "banana" };
Console.WriteLine(list.Contains("ban")); // False

string.Containsは部分一致ですが、List.Containsは要素一致です。

8-5. 初心者が混同しやすいContainsの使い分け

初心者がよく混同するのは、次のようなケースです。

C#
List<string> names = new List<string>
{
"Tanaka",
"Yamada",
"Suzuki"
};

bool result = names.Contains("aka");

Console.WriteLine(result); // False

"Tanaka"には"aka"が含まれていますが、リストの要素として"aka"は存在しないためfalseになります。

リスト内の各文字列に部分一致したい場合は、次のように書きます。

C#
using System.Linq;

List<string> names = new List<string>
{
"Tanaka",
"Yamada",
"Suzuki"
};

bool result = names.Any(name => name.Contains("aka"));

Console.WriteLine(result); // True

つまり、次のように考えるとわかりやすいです。

やりたいこと書き方
1つの文字列内を検索するstring.Contains
リストに同じ要素があるか調べるList.Contains
リスト内の各文字列を部分一致検索するAny(x => x.Contains(...))

9. Containsでできないことと代替方法

9-1. 複雑なパターン検索にはRegexを使う

Containsは単純な部分一致には便利ですが、複雑なパターン検索には向いていません。

たとえば、次のような判定です。

判定したい内容Containsでの対応
数字が3桁続くか不向き
メールアドレス形式か不向き
郵便番号形式か不向き
複数パターンのいずれかに一致するか条件が複雑になりやすい

このような場合は、正規表現を使うRegexを検討します。

C#
using System.Text.RegularExpressions;

string text = "注文番号は123です";

bool result = Regex.IsMatch(text, @"\d{3}");

Console.WriteLine(result); // True

Containsは、あくまで指定した文字列が含まれるかを見るメソッドです。正規表現のようなパターン検索はできません。

9-2. 位置を知りたい場合はIndexOfを使う

Containsは、含まれているかどうかだけを返します。

文字列がどの位置にあるかを知りたい場合は、IndexOfを使います。IndexOfは、指定した文字列が最初に見つかった位置を返し、見つからない場合は-1を返します。Microsoft Learn+1

C#
string text = "Hello World";

int index = text.IndexOf("World");

Console.WriteLine(index); // 6

見つかったかどうかだけを知りたい場合はContains、位置も必要な場合はIndexOfを使いましょう。

C#
string text = "Hello World";

if (text.IndexOf("World") >= 0)
{
Console.WriteLine("見つかりました");
}

ただし、単純に存在確認だけならContainsのほうが読みやすいです。Microsoftのコード分析ルールでも、IndexOfの結果を使って存在確認だけをしている場合は、読みやすさのためにContainsの使用が提案されています。Microsoft Learn

9-3. 置換したい場合はReplaceを使う

特定の文字列を別の文字列に置き換えたい場合は、ContainsではなくReplaceを使います。

C#
string text = "Hello World";

string replaced = text.Replace("World", "C#");

Console.WriteLine(replaced); // Hello C#

Containsと組み合わせて、存在する場合だけ置換することもできます。

C#
string text = "Hello World";

if (text.Contains("World"))
{
text = text.Replace("World", "C#");
}

Console.WriteLine(text); // Hello C#

ただし、Replaceは対象が見つからない場合でも元の文字列と同じ内容を返すため、単純な置換だけなら事前にContainsを使わなくても問題ないことが多いです。

9-4. 分割して判定したい場合はSplitを使う

カンマ区切りやスペース区切りの文字列を分割してから判定したい場合は、Splitを使います。

C#
string csv = "apple,banana,orange";

string[] fruits = csv.Split(',');

foreach (string fruit in fruits)
{
Console.WriteLine(fruit);
}

単純にContainsを使うと、意図しない一致が起きる場合があります。

C#
string csv = "apple,banana,orange";

Console.WriteLine(csv.Contains("app")); // True

これは"apple"の一部に"app"が含まれているためです。

要素として完全一致したい場合は、分割してから判定します。

C#
using System.Linq;

string csv = "apple,banana,orange";

bool result = csv.Split(',').Contains("apple");

Console.WriteLine(result); // True

9-5. 大量データ検索ではパフォーマンスに注意する

Containsは便利ですが、大量データに対して何度も実行すると、パフォーマンスに影響することがあります。

たとえば、数十万件のデータを毎回全件走査してContainsするような処理です。

C#
var results = items.Where(item => item.Name.Contains(keyword)).ToList();

このような処理が必ず悪いわけではありませんが、データ量が増えると時間がかかる可能性があります。

大量データを扱う場合は、次のような対策を検討します。

対策内容
データベース側で検索するSQLのLIKEや全文検索を使う
インデックスを使う検索用の構造を用意する
検索対象を絞る必要な範囲だけ検索する
正規化する大文字小文字や空白の扱いを事前に統一する
キャッシュする繰り返し使う検索結果を保持する

小規模な文字列判定ならContainsで十分ですが、大規模検索では設計も重要です。

10. 実践例で学ぶstring.Contains

10-1. 入力値に禁止ワードが含まれているかチェックする

ユーザー投稿や問い合わせフォームでは、禁止ワードのチェックにContainsを使えます。

C#
using System;
using System.Linq;

string input = "この文章には禁止ワードが含まれています";

string[] bannedWords = { "禁止ワード", "スパム", "NG" };

bool hasBannedWord = bannedWords.Any(word =>
input.Contains(word, StringComparison.OrdinalIgnoreCase));

if (hasBannedWord)
{
Console.WriteLine("禁止ワードが含まれています");
}
else
{
Console.WriteLine("問題ありません");
}

禁止ワードが増える場合は、配列やListで管理すると保守しやすくなります。

10-2. ファイル名や拡張子に特定文字列が含まれるか判定する

ファイル名に特定の文字列が含まれているかを判定できます。

C#
string fileName = "2026_report_final.pdf";

if (fileName.Contains("report", StringComparison.OrdinalIgnoreCase))
{
Console.WriteLine("レポートファイルです");
}

ただし、拡張子を判定するならContainsよりEndsWithのほうが適しています。

C#
string fileName = "2026_report_final.pdf";

if (fileName.EndsWith(".pdf", StringComparison.OrdinalIgnoreCase))
{
Console.WriteLine("PDFファイルです");
}

Contains(".pdf")だと、"sample.pdf.txt"のようなファイルも一致してしまう可能性があります。

10-3. メールアドレスに特定ドメインが含まれるか判定する

メールアドレスに特定のドメインが含まれるかを確認できます。

C#
string email = "user@example.com";

if (email.Contains("@example.com", StringComparison.OrdinalIgnoreCase))
{
Console.WriteLine("example.comのメールアドレスです");
}

ただし、ドメイン判定ではEndsWithのほうが適している場合があります。

C#
string email = "user@example.com";

if (email.EndsWith("@example.com", StringComparison.OrdinalIgnoreCase))
{
Console.WriteLine("example.comのメールアドレスです");
}

Containsは途中に含まれていても一致するため、厳密な判定が必要な場合は注意しましょう。

10-4. 検索ボックスのキーワードでデータを絞り込む

検索ボックスに入力されたキーワードで一覧を絞り込む処理にもContainsが使えます。

C#
using System;
using System.Collections.Generic;
using System.Linq;

var products = new List<string>
{
"C#入門書",
"JavaScript実践ガイド",
"ASP.NET Core開発",
"Pythonデータ分析"
};

string keyword = "C#";

var results = products
.Where(product => product.Contains(keyword, StringComparison.OrdinalIgnoreCase))
.ToList();

foreach (var product in results)
{
Console.WriteLine(product);
}

検索キーワードが空の場合は、全件表示するなどの処理に分けると自然です。

C#
if (string.IsNullOrWhiteSpace(keyword))
{
Console.WriteLine("キーワードが空です");
}
else
{
var results = products
.Where(product => product.Contains(keyword, StringComparison.OrdinalIgnoreCase))
.ToList();
}

10-5. ログ文字列にエラー文言が含まれるか判定する

ログ解析でもContainsはよく使われます。

C#
string log = "[2026-06-15 10:00:00] ERROR Connection failed";

if (log.Contains("ERROR"))
{
Console.WriteLine("エラーログです");
}

大文字小文字が揺れる可能性がある場合は、OrdinalIgnoreCaseを指定します。

C#
string log = "[2026-06-15 10:00:00] error connection failed";

if (log.Contains("ERROR", StringComparison.OrdinalIgnoreCase))
{
Console.WriteLine("エラーログです");
}

複数のログレベルを判定する場合は、Anyを使うと簡潔です。

C#
using System;
using System.Linq;

string log = "[2026-06-15 10:00:00] fatal system error";

string[] levels = { "ERROR", "FATAL", "CRITICAL" };

bool isImportant = levels.Any(level =>
log.Contains(level, StringComparison.OrdinalIgnoreCase));

if (isImportant)
{
Console.WriteLine("重要なログです");
}

11. string.Containsのよくあるエラー・つまずきポイント

11-1. 大文字小文字の違いでfalseになる

よくあるつまずきが、大文字小文字の違いです。

C#
string text = "CSharp";

Console.WriteLine(text.Contains("csharp")); // False

通常のContainsは大文字小文字を区別するため、"CSharp""csharp"は一致しません。

対策として、StringComparison.OrdinalIgnoreCaseを指定します。

C#
string text = "CSharp";

Console.WriteLine(text.Contains("csharp", StringComparison.OrdinalIgnoreCase)); // True

11-2. 全角・半角の違いで一致しない

全角と半角は別の文字として扱われます。

C#
string text = "ABC";

Console.WriteLine(text.Contains("ABC")); // False

見た目が似ていても、全角の"A"と半角の"A"は異なります。

必要に応じて、事前に文字列を正規化したり、全角半角変換を行ったりする必要があります。

C#
string text = "ABC";
string keyword = "ABC";

// Containsだけでは全角半角の違いは吸収できない
Console.WriteLine(text.Contains(keyword)); // False

Containsは表記ゆれを自動的に吸収するメソッドではない点に注意しましょう。

11-3. 前後の空白が原因で一致しない

検索文字列や対象文字列に余分な空白があると、一致しないことがあります。

C#
string text = "apple";
string keyword = " apple ";

Console.WriteLine(text.Contains(keyword)); // False

ユーザー入力を使う場合は、Trimで前後の空白を削除するとよいでしょう。

C#
string text = "apple";
string keyword = " apple ";

keyword = keyword.Trim();

Console.WriteLine(text.Contains(keyword)); // True

検索ボックスの入力では、TrimIsNullOrWhiteSpaceを組み合わせると安全です。

C#
string keyword = " apple ";
keyword = keyword.Trim();

if (!string.IsNullOrWhiteSpace(keyword) &&
text.Contains(keyword, StringComparison.OrdinalIgnoreCase))
{
Console.WriteLine("見つかりました");
}

11-4. nullチェックを忘れて例外になる

対象文字列がnullの状態でContainsを呼び出すと、例外になります。

C#
string text = null;

Console.WriteLine(text.Contains("abc")); // NullReferenceException

対策は、nullチェックを入れることです。

C#
if (text != null && text.Contains("abc"))
{
Console.WriteLine("含まれています");
}

または、null条件演算子を使います。

C#
if (text?.Contains("abc") == true)
{
Console.WriteLine("含まれています");
}

実務では、nullになる可能性がある文字列に対しては、必ず安全な書き方を意識しましょう。

11-5. Containsだけで正規表現のような判定をしようとしてしまう

Containsは、指定した文字列がそのまま含まれるかを調べるメソッドです。

次のような正規表現風の指定はできません。

C#
string text = "abc123";

Console.WriteLine(text.Contains(@"\d+")); // False

このコードは「数字が含まれるか」を判定しているのではなく、文字列としての"\d+"が含まれるかを判定しています。

数字が含まれるかを調べたい場合は、Regexを使います。

C#
using System.Text.RegularExpressions;

string text = "abc123";

bool result = Regex.IsMatch(text, @"\d+");

Console.WriteLine(result); // True

単純な部分一致はContains、パターン一致はRegexと使い分けましょう。

11-6. .NETのバージョンによって使える書き方が違う

Containsのオーバーロードは、.NETのバージョンによって使える書き方が異なる場合があります。

たとえば、次の書き方は現在の.NETでは一般的に使えます。

C#
text.Contains("keyword", StringComparison.OrdinalIgnoreCase)

一方、古い.NET Frameworkではこのオーバーロードが使えないことがあります。

その場合は、IndexOfを使って代替します。

C#
text.IndexOf("keyword", StringComparison.OrdinalIgnoreCase) >= 0

古いプロジェクトを保守している場合は、ターゲットフレームワークを確認しましょう。

12. string.Containsに関するFAQ

12-1. Containsは大文字小文字を区別しますか?

はい。通常のContainsは大文字小文字を区別します。

C#
string text = "Hello";

Console.WriteLine(text.Contains("hello")); // False

大文字小文字を無視したい場合は、StringComparison.OrdinalIgnoreCaseを指定します。

C#
Console.WriteLine(text.Contains("hello", StringComparison.OrdinalIgnoreCase)); // True

12-2. 大文字小文字を無視してContainsするにはどう書きますか?

次のように書きます。

C#
string text = "Hello World";

bool result = text.Contains("world", StringComparison.OrdinalIgnoreCase);

Console.WriteLine(result); // True

古い.NET Frameworkでこの書き方が使えない場合は、IndexOfを使います。

C#
bool result = text.IndexOf("world", StringComparison.OrdinalIgnoreCase) >= 0;

12-3. 複数の文字列をContainsで判定するには?

複数キーワードのいずれかを含むか判定するなら、Anyを使います。

C#
using System.Linq;

string text = "C# string.Contains tutorial";

string[] keywords = { "C#", "Java", "Python" };

bool result = keywords.Any(keyword => text.Contains(keyword));

Console.WriteLine(result); // True

すべて含むか判定するなら、Allを使います。

C#
bool result = keywords.All(keyword => text.Contains(keyword));

12-4. Containsで完全一致の判定はできますか?

Containsは部分一致を判定するメソッドなので、完全一致には向いていません。

C#
string text = "apple";

Console.WriteLine(text.Contains("app")); // True

完全一致を判定したい場合は、Equalsまたは==を使います。

C#
Console.WriteLine(text == "apple"); // True
Console.WriteLine(text.Equals("apple")); // True

大文字小文字を無視した完全一致なら、次のように書きます。

C#
bool result = text.Equals("APPLE", StringComparison.OrdinalIgnoreCase);

12-5. ContainsとIndexOfはどちらを使うべきですか?

含まれているかどうかだけを知りたい場合は、Containsを使うのがおすすめです。

C#
if (text.Contains("keyword"))
{
Console.WriteLine("見つかりました");
}

見つかった位置を知りたい場合は、IndexOfを使います。

C#
int index = text.IndexOf("keyword");

if (index >= 0)
{
Console.WriteLine($"位置: {index}");
}

目的に応じて使い分けましょう。

目的使うメソッド
存在確認だけしたいContains
見つかった位置を知りたいIndexOf
大文字小文字を無視して存在確認したいContains(..., StringComparison.OrdinalIgnoreCase)
古い.NET Frameworkで大文字小文字を無視したいIndexOf(..., StringComparison.OrdinalIgnoreCase) >= 0

12-6. Containsは日本語の文字列でも使えますか?

はい。日本語の文字列でも使えます。

C#
string text = "今日は良い天気です";

Console.WriteLine(text.Contains("天気")); // True

ただし、表記ゆれには注意が必要です。

C#
string text = "カタカナ";

Console.WriteLine(text.Contains("かたかな")); // False

ひらがな・カタカナ、全角・半角、旧字体・新字体などの違いを吸収したい場合は、Containsだけでは不十分です。必要に応じて、検索前の正規化や変換処理を行いましょう。

12-7. Containsでnullを安全に扱うには?

対象文字列がnullになる可能性がある場合は、null条件演算子を使うと安全です。

C#
string text = null;

bool result = text?.Contains("keyword") == true;

Console.WriteLine(result); // False

または、string.IsNullOrEmptystring.IsNullOrWhiteSpaceと組み合わせます。

C#
if (!string.IsNullOrWhiteSpace(text) &&
text.Contains("keyword", StringComparison.OrdinalIgnoreCase))
{
Console.WriteLine("含まれています");
}

検索キーワード側も空文字やnullになる可能性がある場合は、両方チェックするとより安全です。

C#
if (!string.IsNullOrWhiteSpace(text) &&
!string.IsNullOrWhiteSpace(keyword) &&
text.Contains(keyword, StringComparison.OrdinalIgnoreCase))
{
Console.WriteLine("含まれています");
}

まとめ

C# string.Containsは、文字列の中に指定した文字や文字列が含まれているかを判定するための基本的なメソッドです。

戻り値はbool型で、含まれていればtrue、含まれていなければfalseを返します。

C#
string text = "C# string.Contains";

bool result = text.Contains("Contains");

Console.WriteLine(result); // True

ただし、実務で使う場合は次のポイントに注意しましょう。

ポイント内容
部分一致Containsは完全一致ではなく部分一致
大文字小文字通常は区別される
大文字小文字を無視StringComparison.OrdinalIgnoreCaseを使う
null対策?.Contains(...) == trueIsNullOrWhiteSpaceを使う
複数条件AnyAllを使うと便利
完全一致Equalsまたは==を使う
前方一致・後方一致StartsWithEndsWithを使う
位置取得IndexOfを使う
複雑な検索Regexを使う

特に、大文字小文字を無視したい場合は、次の書き方を覚えておくと便利です。

C#
text.Contains("keyword", StringComparison.OrdinalIgnoreCase)

古い.NET Frameworkでは、次のようにIndexOfで代替できます。

C#
text.IndexOf("keyword", StringComparison.OrdinalIgnoreCase) >= 0

Containsはシンプルですが、使い方を誤ると、大文字小文字、null、空文字、全角半角、完全一致との混同などでバグにつながることがあります。

「部分一致をしたいのか」「大文字小文字を区別するのか」「nullの可能性はあるのか」を意識して使えば、C#の文字列検索を安全で読みやすく実装できます。