C#で部分一致検索する方法|Contains・LINQ・正規表現の使い分けを解説
はじめに
C#で文字列やデータ一覧を扱うとき、「指定したキーワードを含むデータだけを探したい」という場面はよくあります。たとえば、商品名に「USB」を含むデータを抽出したり、ユーザー名に特定の文字列が含まれているか判定したりする処理です。
このような検索方法を「部分一致検索」と呼びます。C#では、単純な文字列検索であればContains、配列やListなどのコレクション検索であればLINQ、複雑な条件検索であれば正規表現を使うのが一般的です。
この記事では、C#で部分一致検索を行う方法について、Contains・IndexOf・LINQ・正規表現の使い方と使い分けを、サンプルコード付きで解説します。
1. C#の部分一致検索とは
1-1. 部分一致検索の意味
部分一致検索とは、対象となる文字列の中に、指定した文字列が含まれているかを調べる検索方法です。
たとえば、次の文字列があるとします。
C#string text = "C#で部分一致検索を学ぶ";
この文字列に「部分一致」が含まれているかを調べる場合、完全に同じ文字列でなくても、文字列の一部として含まれていれば一致と判定します。
C#bool result = text.Contains("部分一致");
Console.WriteLine(result); // True
C#では、文字列の部分一致検索にContainsを使うのが最も基本的です。
1-2. 完全一致・前方一致・後方一致との違い
文字列検索には、部分一致以外にもいくつかの種類があります。
完全一致は、文字列全体が検索キーワードと完全に同じ場合に一致します。
C#string text = "apple";
Console.WriteLine(text == "apple"); // True
Console.WriteLine(text == "app"); // False
前方一致は、文字列の先頭が指定したキーワードで始まる場合に一致します。
C#string text = "apple";
Console.WriteLine(text.StartsWith("app")); // True
後方一致は、文字列の末尾が指定したキーワードで終わる場合に一致します。
C#string text = "apple";
Console.WriteLine(text.EndsWith("le")); // True
一方、部分一致は、文字列のどこかにキーワードが含まれていれば一致します。
C#string text = "apple";
Console.WriteLine(text.Contains("pp")); // True
つまり、C#で「文字列に指定したキーワードが含まれているか」を調べたい場合は、部分一致検索を使います。
1-3. C#で部分一致検索が使われる主な場面
C#の部分一致検索は、実務でもよく使われます。主な場面は次のとおりです。
C#// 商品名にキーワードが含まれるか
"USBケーブル".Contains("USB");
// メールアドレスに特定のドメインが含まれるか
"user@example.com".Contains("@example.com");
// ファイル名に特定の文字列が含まれるか
"report_2026.xlsx".Contains("report");
// ログメッセージにエラー文言が含まれるか
"System Error occurred".Contains("Error");
検索フォーム、一覧の絞り込み、ログ解析、入力チェックなど、部分一致検索は幅広い場面で使われます。
2. C#で文字列を部分一致検索する基本方法
2-1. Containsで文字列を含むか判定する
Containsは、対象の文字列に指定した文字列が含まれているかをtrueまたはfalseで返します。
C#string text = "C# programming";
bool result = text.Contains("program");
Console.WriteLine(result); // True
Containsは直感的に書けるため、C#で部分一致を判定する最も基本的な方法です。
2-2. IndexOfで部分一致を判定する
IndexOfは、指定した文字列が最初に出現する位置を返します。見つからない場合は-1を返します。
C#string text = "C# programming";
int index = text.IndexOf("program");
Console.WriteLine(index); // 3
部分一致しているかどうかだけを判定したい場合は、次のように書きます。
C#string text = "C# programming";
bool result = text.IndexOf("program") >= 0;
Console.WriteLine(result); // True
IndexOfは、大文字・小文字を無視した検索や、検索位置を取得したい場合に便利です。
2-3. StartsWithで前方一致を判定する
StartsWithは、文字列が指定したキーワードで始まるかを判定します。
C#string text = "CSharp";
bool result = text.StartsWith("C");
Console.WriteLine(result); // True
部分一致ではありませんが、検索条件として「先頭が一致するか」を調べたい場合に使います。
2-4. EndsWithで後方一致を判定する
EndsWithは、文字列が指定したキーワードで終わるかを判定します。
C#string fileName = "sample.csv";
bool result = fileName.EndsWith(".csv");
Console.WriteLine(result); // True
ファイル拡張子の判定などでよく使われます。
3. Containsを使った部分一致検索の書き方
3-1. 基本的なContainsの使い方
Containsの基本構文は次のとおりです。
C#文字列.Contains(検索キーワード)
サンプルコードを見てみましょう。
C#string message = "C#で部分一致検索を行います";
bool result = message.Contains("部分一致");
Console.WriteLine(result); // True
検索キーワードが含まれていればtrue、含まれていなければfalseになります。
C#string message = "C#で部分一致検索を行います";
Console.WriteLine(message.Contains("Java")); // False
3-2. if文で部分一致を判定する方法
実際のプログラムでは、if文と組み合わせて使うことが多いです。
C#string text = "C#でWebアプリを開発する";
if (text.Contains("Web"))
{
Console.WriteLine("Webに関する文字列です");
}
else
{
Console.WriteLine("Webに関する文字列ではありません");
}
検索フォームや条件分岐では、このようにContainsの結果を使って処理を分けます。
3-3. 大文字・小文字を区別する場合の注意点
Containsは、通常は大文字・小文字を区別します。
C#string text = "CSharp";
Console.WriteLine(text.Contains("Sharp")); // True
Console.WriteLine(text.Contains("sharp")); // False
Sharpとsharpは別の文字列として扱われるため、検索キーワードの大文字・小文字が違うと一致しません。
英数字を含む検索では、この違いによって想定どおりに検索できないことがあります。
3-4. 大文字・小文字を区別せずに検索する方法
.NET Coreや.NET 5以降では、StringComparisonを指定して大文字・小文字を無視できます。
C#string text = "CSharp";
bool result = text.Contains("sharp", StringComparison.OrdinalIgnoreCase);
Console.WriteLine(result); // True
.NET Frameworkなどでこの overload が使えない場合は、IndexOfを使う方法がよく使われます。
C#string text = "CSharp";
bool result = text.IndexOf("sharp", StringComparison.OrdinalIgnoreCase) >= 0;
Console.WriteLine(result); // True
単純にToLower()やToUpper()で変換する方法もありますが、不要な文字列生成が発生するため、可能であればStringComparison.OrdinalIgnoreCaseを使うのがおすすめです。
4. LINQでコレクションを部分一致検索する方法
4-1. Listから部分一致する要素を検索する
List<string>などのコレクションから、指定したキーワードを含む要素を探す場合はLINQを使うと便利です。
C#using System;
using System.Collections.Generic;
using System.Linq;
var fruits = new List<string>
{
"apple",
"banana",
"grape",
"pineapple"
};
var results = fruits.Where(x => x.Contains("apple")).ToList();
foreach (var item in results)
{
Console.WriteLine(item);
}
実行結果は次のようになります。
C#apple
pineapple
WhereとContainsを組み合わせることで、部分一致する要素だけを抽出できます。
4-2. WhereとContainsを組み合わせる方法
Whereは、条件に一致する要素を絞り込むLINQのメソッドです。
C#var names = new List<string>
{
"Tanaka",
"Yamada",
"Takahashi",
"Suzuki"
};
var filtered = names.Where(name => name.Contains("Ta"));
foreach (var name in filtered)
{
Console.WriteLine(name);
}
この例では、「Ta」を含む名前だけが取得されます。
検索結果をListとして扱いたい場合は、最後にToList()を付けます。
C#var filteredList = names
.Where(name => name.Contains("Ta"))
.ToList();
4-3. FirstOrDefaultで最初に一致する要素を取得する
部分一致する要素のうち、最初の1件だけを取得したい場合はFirstOrDefaultを使います。
C#var products = new List<string>
{
"USBケーブル",
"HDMIケーブル",
"USBメモリ",
"マウス"
};
string result = products.FirstOrDefault(x => x.Contains("USB"));
Console.WriteLine(result); // USBケーブル
一致する要素が見つからない場合、参照型ではnullが返ります。
C#string result = products.FirstOrDefault(x => x.Contains("キーボード"));
if (result == null)
{
Console.WriteLine("該当データはありません");
}
4-4. Anyで一致する要素が存在するか判定する
部分一致する要素が1件でも存在するかを調べたい場合はAnyを使います。
C#var products = new List<string>
{
"USBケーブル",
"HDMIケーブル",
"マウス"
};
bool exists = products.Any(x => x.Contains("USB"));
Console.WriteLine(exists); // True
Anyは存在チェックに向いています。該当データの一覧が必要ない場合は、Whereよりも意図が分かりやすくなります。
4-5. オブジェクトのプロパティを部分一致検索する方法
実務では、文字列のリストではなく、オブジェクトのリストを検索することが多いです。
C#using System;
using System.Collections.Generic;
using System.Linq;
public class Product
{
public string Name { get; set; }
public string Category { get; set; }
}
商品名にキーワードを含むデータを検索する例です。
C#var products = new List<Product>
{
new Product { Name = "USBケーブル", Category = "PC用品" },
new Product { Name = "HDMIケーブル", Category = "家電" },
new Product { Name = "USBメモリ", Category = "PC用品" }
};
var results = products
.Where(p => p.Name.Contains("USB"))
.ToList();
foreach (var product in results)
{
Console.WriteLine(product.Name);
}
オブジェクト検索では、p.Name.Contains("USB")のようにプロパティに対してContainsを使います。
5. 正規表現で柔軟に部分一致検索する方法
5-1. Regex.IsMatchの基本的な使い方
正規表現を使うと、単純な文字列だけでなく、パターンに一致するかを検索できます。
C#using System;
using System.Text.RegularExpressions;
string text = "商品番号はA123です";
bool result = Regex.IsMatch(text, "A123");
Console.WriteLine(result); // True
Regex.IsMatchは、対象文字列が指定した正規表現パターンに一致するかをtrueまたはfalseで返します。
5-2. 複数条件の部分一致検索を行う方法
正規表現では、|を使ってOR条件を表現できます。
C#string text = "C#とJavaを学習中です";
bool result = Regex.IsMatch(text, "C#|Python|Java");
Console.WriteLine(result); // True
この例では、「C#」「Python」「Java」のいずれかが含まれていれば一致します。
複数のキーワードを柔軟に検索したい場合に便利です。
5-3. 数字・英字・記号などのパターンを検索する方法
正規表現は、数字や英字などのパターン検索にも向いています。
数字が含まれているかを判定する例です。
C#string text = "注文番号: 12345";
bool hasNumber = Regex.IsMatch(text, @"\d+");
Console.WriteLine(hasNumber); // True
英字が含まれているかを判定する例です。
C#string text = "商品コード: ABC123";
bool hasAlphabet = Regex.IsMatch(text, @"[A-Za-z]+");
Console.WriteLine(hasAlphabet); // True
メールアドレスのような形式を簡易的にチェックすることもできます。
C#string email = "user@example.com";
bool isEmailLike = Regex.IsMatch(email, @"^[^@\s]+@[^@\s]+\.[^@\s]+$");
Console.WriteLine(isEmailLike); // True
5-4. RegexOptions.IgnoreCaseで大文字・小文字を無視する方法
正規表現で大文字・小文字を無視したい場合は、RegexOptions.IgnoreCaseを指定します。
C#string text = "CSharp";
bool result = Regex.IsMatch(
text,
"sharp",
RegexOptions.IgnoreCase
);
Console.WriteLine(result); // True
英字を含む検索では、RegexOptions.IgnoreCaseを使うことで、ユーザー入力の大文字・小文字の違いを吸収できます。
5-5. 正規表現を使うべきケースと注意点
正規表現は強力ですが、常に使うべきとは限りません。
単純に「文字列を含むか」を判定するだけなら、Containsのほうが読みやすく、実装も簡単です。
C#// 単純な部分一致ならこちらで十分
text.Contains("C#");
一方で、次のような条件では正規表現が向いています。
C#// 数字を含むか
Regex.IsMatch(text, @"\d");
// 英字3文字 + 数字4桁のような形式
Regex.IsMatch(text, @"^[A-Z]{3}\d{4}$");
// 複数キーワードのいずれかを含むか
Regex.IsMatch(text, "error|warning|failed", RegexOptions.IgnoreCase);
ただし、複雑すぎる正規表現は可読性が下がります。実務では、保守しやすい範囲で使うことが大切です。
6. Contains・LINQ・正規表現の使い分け
6-1. 単純な文字列検索ならContains
1つの文字列に特定のキーワードが含まれているかを調べるだけなら、Containsを使うのが最も簡単です。
C#string text = "C#で部分一致検索";
if (text.Contains("C#"))
{
Console.WriteLine("C#を含みます");
}
コードの意図が分かりやすいため、単純な部分一致検索ではまずContainsを検討しましょう。
6-2. 配列やListの検索ならLINQ
配列やListの中から、部分一致する要素を探したい場合はLINQが便利です。
C#var items = new List<string>
{
"東京駅",
"新宿駅",
"大阪駅",
"京都駅"
};
var results = items.Where(x => x.Contains("駅")).ToList();
複数件を取得したいならWhere、最初の1件だけならFirstOrDefault、存在チェックだけならAnyを使います。
6-3. 複雑な条件検索なら正規表現
検索条件が単純な文字列ではなく、パターンになっている場合は正規表現を使います。
C#string text = "ID: ABC-1234";
bool result = Regex.IsMatch(text, @"[A-Z]{3}-\d{4}");
Console.WriteLine(result); // True
「数字を含む」「特定の形式に一致する」「複数パターンのいずれかに一致する」といった条件では、正規表現が役立ちます。
6-4. 処理速度や可読性を考慮した選び方
部分一致検索では、処理速度と可読性のバランスも重要です。
単純な検索であれば、Containsが分かりやすく十分です。
C#text.Contains("keyword");
大文字・小文字を無視するなら、StringComparisonを指定します。
C#text.Contains("keyword", StringComparison.OrdinalIgnoreCase);
大量データを何度も検索する場合や、複雑な正規表現を繰り返し使う場合は、パフォーマンスに注意が必要です。
C#var regex = new Regex("error|warning", RegexOptions.IgnoreCase);
bool result = regex.IsMatch("System Error");
正規表現を何度も使う場合は、Regexオブジェクトを再利用すると無駄を減らせます。
6-5. 実務で迷いやすいケース別の使い分け
実務では、次のように使い分けると分かりやすいです。
C#// 文字列にキーワードが含まれるか
text.Contains(keyword);
// Listから一致するデータを絞り込む
list.Where(x => x.Contains(keyword));
// オブジェクトのプロパティを検索する
products.Where(p => p.Name.Contains(keyword));
// 最初の1件だけ取得する
products.FirstOrDefault(p => p.Name.Contains(keyword));
// 存在チェックだけ行う
products.Any(p => p.Name.Contains(keyword));
// パターンで検索する
Regex.IsMatch(text, pattern);
単純な条件ほどContains、データ一覧の検索ならLINQ、複雑な条件なら正規表現を選ぶと、読みやすいコードになります。
7. C#の部分一致検索でよくあるエラー・注意点
7-1. nullの文字列でContainsを使うと例外が発生する
nullの文字列に対してContainsを呼び出すと、NullReferenceExceptionが発生します。
C#string text = null;
bool result = text.Contains("C#"); // 例外が発生
安全に判定するには、nullチェックを行います。
C#string text = null;
bool result = text != null && text.Contains("C#");
Console.WriteLine(result); // False
または、null条件演算子を使う方法もあります。
C#bool result = text?.Contains("C#") == true;
オブジェクトのプロパティを検索する場合も、プロパティがnullの可能性に注意しましょう。
C#var results = products
.Where(p => p.Name != null && p.Name.Contains("USB"))
.ToList();
7-2. 大文字・小文字の違いで一致しない
Containsは大文字・小文字を区別するため、次のコードはfalseになります。
C#string text = "Error Message";
bool result = text.Contains("error");
Console.WriteLine(result); // False
大文字・小文字を無視したい場合は、StringComparison.OrdinalIgnoreCaseを使います。
C#bool result = text.Contains("error", StringComparison.OrdinalIgnoreCase);
Console.WriteLine(result); // True
ログ検索やユーザー入力の検索では、大文字・小文字を無視する設計にしたほうが使いやすい場合があります。
7-3. 全角・半角や空白の違いで一致しない
C#の文字列検索では、全角と半角は別の文字として扱われます。
C#string text = "C#入門";
Console.WriteLine(text.Contains("C#")); // False
また、余分な空白がある場合も一致しないことがあります。
C#string text = "C# 入門";
Console.WriteLine(text.Contains("C#入門")); // False
入力値を検索に使う場合は、必要に応じてTrimで前後の空白を取り除きます。
C#string keyword = " C# ".Trim();
bool result = text.Contains(keyword);
全角・半角の統一が必要な場合は、検索前に文字列を正規化する処理を検討します。
7-4. 日本語検索で注意すべきポイント
日本語の部分一致検索では、表記ゆれに注意が必要です。
たとえば、次のような違いがあります。
C#// ひらがな・カタカナ
"りんご"
"リンゴ"
// 全角・半角
"カタカナ"
"カタカナ"
// 空白の有無
"東京都 新宿区"
"東京都新宿区"
Containsは文字列をそのまま比較するため、これらは基本的に別の文字列として扱われます。
検索精度を上げたい場合は、入力値と検索対象の表記をそろえる処理が必要です。
C#string text = "東京都 新宿区";
string keyword = "東京都新宿区";
bool result = text.Replace(" ", "").Contains(keyword);
Console.WriteLine(result); // True
日本語検索では、単純なContainsだけで十分か、表記ゆれ対応が必要かを事前に考えることが大切です。
7-5. パフォーマンスが悪くなる検索条件
部分一致検索は便利ですが、大量データに対して何度も実行すると処理が重くなることがあります。
特に次のようなケースでは注意が必要です。
C#// 大量データに対して毎回ToLowerする
var results = list
.Where(x => x.ToLower().Contains(keyword.ToLower()))
.ToList();
この書き方は分かりやすいものの、検索のたびに新しい文字列が作られるため、データ量が多い場合は効率が悪くなります。
可能であれば、StringComparison.OrdinalIgnoreCaseを使います。
C#var results = list
.Where(x => x.Contains(keyword, StringComparison.OrdinalIgnoreCase))
.ToList();
また、複雑な正規表現を大量データに対して使う場合も、処理速度に影響することがあります。必要以上に複雑な条件にせず、まずは読みやすくシンプルな検索方法を選びましょう。
8. C#の部分一致検索の実践サンプル
8-1. 入力キーワードで文字列を検索するサンプル
ユーザーが入力したキーワードで文字列を検索する例です。
C#using System;
class Program
{
static void Main()
{
string text = "C#で部分一致検索を学習しています";
Console.Write("検索キーワードを入力してください: ");
string keyword = Console.ReadLine();
if (!string.IsNullOrEmpty(keyword) && text.Contains(keyword))
{
Console.WriteLine("キーワードが見つかりました");
}
else
{
Console.WriteLine("キーワードは見つかりませんでした");
}
}
}
string.IsNullOrEmptyを使うことで、空文字やnullの入力を避けられます。
8-2. Listの中から該当データを絞り込むサンプル
商品一覧からキーワードを含む商品を検索するサンプルです。
C#using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
static void Main()
{
var products = new List<string>
{
"USBケーブル",
"HDMIケーブル",
"ワイヤレスマウス",
"USBメモリ",
"キーボード"
};
string keyword = "USB";
var results = products
.Where(p => p.Contains(keyword))
.ToList();
foreach (var product in results)
{
Console.WriteLine(product);
}
}
}
実行結果は次のようになります。
C#USBケーブル
USBメモリ
8-3. 複数キーワードで部分一致検索するサンプル
複数のキーワードのいずれかに一致するデータを検索する例です。
C#var products = new List<string>
{
"USBケーブル",
"HDMIケーブル",
"ワイヤレスマウス",
"USBメモリ",
"キーボード"
};
var keywords = new List<string>
{
"USB",
"マウス"
};
var results = products
.Where(product => keywords.Any(keyword => product.Contains(keyword)))
.ToList();
foreach (var product in results)
{
Console.WriteLine(product);
}
このコードでは、「USB」または「マウス」を含む商品が抽出されます。
すべてのキーワードを含むデータだけを取得したい場合は、AnyではなくAllを使います。
C#var results = products
.Where(product => keywords.All(keyword => product.Contains(keyword)))
.ToList();
8-4. 大文字・小文字を無視した検索サンプル
英字を含む検索では、大文字・小文字を無視したいケースがあります。
C#var languages = new List<string>
{
"CSharp",
"JavaScript",
"Python",
"csharp tutorial"
};
string keyword = "CSHARP";
var results = languages
.Where(x => x.Contains(keyword, StringComparison.OrdinalIgnoreCase))
.ToList();
foreach (var item in results)
{
Console.WriteLine(item);
}
実行結果は次のようになります。
C#CSharp
csharp tutorial
ユーザー入力を検索キーワードにする場合は、このように大文字・小文字を無視すると使いやすくなります。
8-5. 正規表現を使った条件検索サンプル
商品コードのように、特定の形式に一致する文字列を検索する場合は正規表現が便利です。
C#using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
class Program
{
static void Main()
{
var codes = new List<string>
{
"ABC-1234",
"XYZ-9999",
"TEST",
"A12-345"
};
string pattern = @"^[A-Z]{3}-\d{4}$";
var results = codes
.Where(code => Regex.IsMatch(code, pattern))
.ToList();
foreach (var code in results)
{
Console.WriteLine(code);
}
}
}
実行結果は次のようになります。
C#ABC-1234
XYZ-9999
この例では、「英字3文字」「ハイフン」「数字4桁」という形式に一致する文字列だけを抽出しています。
9. C#の部分一致検索に関するよくある質問
9-1. Containsで大文字・小文字を無視できますか
はい、できます。
.NET Coreや.NET 5以降では、StringComparison.OrdinalIgnoreCaseを指定できます。
C#string text = "CSharp";
bool result = text.Contains("csharp", StringComparison.OrdinalIgnoreCase);
Console.WriteLine(result); // True
環境によってこの書き方が使えない場合は、IndexOfを使います。
C#bool result = text.IndexOf("csharp", StringComparison.OrdinalIgnoreCase) >= 0;
9-2. List内の文字列を部分一致で検索するにはどうすればよいですか
LINQのWhereとContainsを組み合わせます。
C#var list = new List<string>
{
"apple",
"banana",
"pineapple"
};
var results = list
.Where(x => x.Contains("apple"))
.ToList();
部分一致する要素をすべて取得したい場合はWhere、最初の1件だけ取得したい場合はFirstOrDefaultを使います。
C#string first = list.FirstOrDefault(x => x.Contains("apple"));
9-3. 複数のキーワードを部分一致検索できますか
はい、できます。
いずれかのキーワードを含むか調べる場合は、Anyを使います。
C#var keywords = new List<string> { "apple", "banana" };
var results = list
.Where(x => keywords.Any(keyword => x.Contains(keyword)))
.ToList();
すべてのキーワードを含むか調べる場合は、Allを使います。
C#var results = list
.Where(x => keywords.All(keyword => x.Contains(keyword)))
.ToList();
9-4. ContainsとIndexOfはどちらを使うべきですか
単純に「含まれているか」を判定したいだけなら、Containsを使うのがおすすめです。
C#text.Contains("keyword");
一方で、検索キーワードが出現する位置を知りたい場合や、古い環境で大文字・小文字を無視した検索を行いたい場合はIndexOfが便利です。
C#int index = text.IndexOf("keyword");
bool result = text.IndexOf("keyword", StringComparison.OrdinalIgnoreCase) >= 0;
可読性を重視するならContains、位置情報や細かい比較条件が必要ならIndexOfを使うとよいでしょう。
9-5. 正規表現はどのようなときに使うべきですか
正規表現は、単純な文字列ではなく、パターンで検索したいときに使います。
たとえば、次のようなケースです。
C#// 数字を含むか
Regex.IsMatch(text, @"\d");
// 郵便番号のような形式
Regex.IsMatch(text, @"^\d{3}-\d{4}$");
// 複数キーワードのいずれかを含むか
Regex.IsMatch(text, "error|warning|failed", RegexOptions.IgnoreCase);
ただし、単純な部分一致検索であればContainsのほうが読みやすく、保守もしやすいです。正規表現は、検索条件が複雑な場合に使うのが基本です。
まとめ
C#で部分一致検索を行う場合、最も基本になるのはContainsです。文字列に指定したキーワードが含まれているかを簡単に判定できます。
C#text.Contains("keyword");
配列やListなどのコレクションから部分一致するデータを探す場合は、LINQと組み合わせます。
C#list.Where(x => x.Contains("keyword")).ToList();
最初の1件だけ取得したい場合はFirstOrDefault、存在チェックだけ行いたい場合はAnyを使うと、意図が分かりやすいコードになります。
C#list.FirstOrDefault(x => x.Contains("keyword"));
list.Any(x => x.Contains("keyword"));
複雑な条件やパターンで検索したい場合は、正規表現を使います。
C#Regex.IsMatch(text, @"\d+");
C#の部分一致検索では、単純な文字列検索ならContains、一覧データの検索ならLINQ、複雑な条件検索なら正規表現という使い分けが基本です。
また、null、大文字・小文字、全角・半角、空白、日本語の表記ゆれなどにも注意が必要です。検索対象やユーザー入力の性質に合わせて、適切な検索方法を選びましょう。

