C#のContainsメソッドの使い方|IndexOfの使い方も解説
- プログラマー
- C#の文字列検索の方法ってどんなものがあるんですか?
- プロジェクト
リーダー - いくつかパターンがあるので、コードを見ながら紹介していきますね。
C#の文字列検索とは
文字列操作において、特定の文字列を検索したい場面はよくあります。検索方法にもいくつか種類があり、C#をはじめとして各種言語においても、汎用メソッドが用意されているほどです。データ処理の基本となるので、確実に覚えておきたい内容の一つでしょう。
C#のContainsメソッドの使い方5つ
文字列や配列、コレクションに指定文字列が含まれるかを調べるために、C#ではContainsメソッドを使用します。
ここでは以下の5つの使い方をC#で示しています。
・文字列に指定文字列が含まれるかどうかを調べます。
・文字列からなるListに指定文字列が含まれるかどうかを調べます。
・文字列からなるListに複数の指定文字列が含まれるかどうかを調べます。
・Linqを使用して文字列からなる配列に指定文字列が含まれるかどうかを調べます。
・IEqualityComparerを実装して比較規則を実装した例を確認します。
1:文字列内に指定の文字・または文字列が含まれるか確かめる方法
C#のContainsメソッドは、指定した文字列が対象の文字列に含まれているかを確認するためのものです。IndexOfメソッドと違い、指定した位置を返すものではないですが、指定した文字列の存在を確認したいだけならこれで十分でしょう。このメソッドはString型とList型で利用できますが、配列型には使用できませんので注意が必要です。(LinqのContainsメソッドを使って行うことは可能)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
using System;
namespace Contais_Test
{
class Test
{
static void Main()
{
string test_str = "この文字列はテスト用です。";
string search_str = "は";
Console.WriteLine(test_str.Contains(search_str));
}
}
}
|
実行結果
1
2
3
|
True
|
このコードでは、指定した文字列内に検索対象の文字列が含まれているかを返します。
2:Listに指定した要素が含まれるか確かめる方法
Listのコレクションには標準でContainsメソッドが存在します。以下にC#で文字列のListに指定文字列が含まれるかを確かめる例を示します。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
using System;
using System.Collections.Generic;
namespace Contais_List
{
class Program
{
static void Main(string[] args)
{
var strList = new List<string>();
strList.Add("Jan");
strList.Add("Feb");
strList.Add("Mar");
strList.Add("Apr");
string kwd = "Mar";
if (strList.Contains(kwd))
{
Console.WriteLine("{0}が見つかりました", kwd);
}
else
{
Console.WriteLine("{0}は見つかりませんでした", kwd);
}
Console.ReadKey();
}
}
}
|
実行結果
1
2
3
|
Marが見つかりました
|
3:複数のキーワードが含まれるか確かめる方法
ListのContainsメソッドでは一つのキーワードのみが指定できます。ContainsメソッドをANDやORで連結することにより、複数のキーワードが含まれるかの確認ができます。
ANDを使う場合
ListのContainsメソッドでは一つのキーワードのみが指定できます。ANDで連結することにより、複数のキーワードが含まれるかの確認ができます。以下にC#による例を示します。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
using System;
using System.Collections.Generic;
namespace Contais_List_And
{
class Program
{
static void Main(string[] args)
{
var strList = new List<string>();
strList.Add("Jan");
strList.Add("Feb");
strList.Add("Mar");
strList.Add("Apr");
string kwd1 = "Jan";
string kwd2 = "Aug";
if (strList.Contains(kwd1) && strList.Contains(kwd2))
{
Console.WriteLine("{0}、{1}どちらも見つかりました", kwd1, kwd2);
}
else
{
Console.WriteLine("{0}、{1}のどちらかが見つかりませんでした", kwd1, kwd2);
}
}
}
}
|
実行結果
1
2
3
|
Jan、Augのどちらかが見つかりませんでした
|
ORを使う場合
ListのContainsメソッドでは一つのキーワードのみが指定できます。ORで連結することにより、複数のキーワードが含まれるかの確認ができます。以下にC#による例を示します。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
using System;
using System.Collections.Generic;
namespace Contais_List_Or
{
class Program
{
static void Main(string[] args)
{
var strList = new List<string>();
strList.Add("Jan");
strList.Add("Feb");
strList.Add("Mar");
strList.Add("Apr");
string kwd1 = "Mar";
string kwd2 = "Aug";
if (strList.Contains(kwd1) || strList.Contains(kwd2))
{
Console.WriteLine("{0}、{1}のどちらかが見つかりました", kwd1, kwd2);
}
else
{
Console.WriteLine("{0}、{1}どちらも見つかりませんでした", kwd1, kwd2);
}
Console.ReadKey();
}
}
}
|
実行結果
1
2
3
|
Mar、Augのどちらかが見つかりました
|
4:LINQやIEqualityComparerを使用する場合の使い方
配列は標準ではContainsメソッドが存在しませんが、Linqを使用することにより拡張メソッドとして使用することができます。
IEqualityComparerインターフェースとはコレクションに対してカスタマイズした等価比較を実装するときに使用します。
大文字・小文字を考慮しない文字列の比較や作成したクラスの配列の比較などのクラスをC#で実装し、Containsメソッドの比較規則として使用できます。
1:配列に指定した要素が含まれるか確かめる方法
配列は標準ではContainsメソッドは使用できませんが、Linqを使用することにより拡張メソッドとして使用できます。
以下にC#で配列に対してContainsを使用した例を示します。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
using System;
using System.Linq;
namespace Contais_Array
{
class Program
{
static void Main(string[] args)
{
var strArry = new string[] { "Jan", "Feb", "Mar", "Apr"};
string kwd = "Apr";
if (strArry.Contains(kwd))
{
Console.WriteLine("{0}が見つかりました", kwd);
}
else
{
Console.WriteLine("{0}は見つかりませんでした", kwd);
}
kwd = "apr";
if (strArry.Contains(kwd))
{
Console.WriteLine("{0}が見つかりました", kwd);
}
else
{
Console.WriteLine("{0}は見つかりませんでした", kwd);
}
Console.ReadKey();
}
}
}
|
実行結果
1
2
3
4
|
Aprが見つかりました
aprは見つかりませんでした
|
2:配列に指定した要素が含まれるかをIEqualityComparerを使用して確かめる方法
IEqualityComparerインターフェースを実装したクラスを作成することにより、Containsメソッドが拡張できます。
以下に文字列を小文字に変換した後に比較するクラスをC#で実装した例を示します。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
using System;
using System.Collections.Generic;
using System.Linq;
namespace Contais_Array_Linq
{
class Program
{
static void Main(string[] args)
{
var strArry = new string[] { "Jan", "Feb", "Mar", "Apr" };
string kwd = "apr";
if (strArry.Contains(kwd, new StringEqualityComparer()))
{
Console.WriteLine("{0}が見つかりました", kwd);
}
else
{
Console.WriteLine("{0}は見つかりませんでした", kwd);
}
}
}
public class StringEqualityComparer : IEqualityComparer<string>
{
public bool Equals(string x, string y)
{
return (x.ToLower() == y.ToLower());
}
public int GetHashCode(string obj)
{
return obj.ToLower().GetHashCode();
}
}
}
|
実行結果
1
2
3
|
aprが見つかりました
|
以下にPersonクラスの配列に指定したPersonが含まれるかを確認するクラスをC#で実装した例を示します。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
|
using System;
using System.Collections.Generic;
//
// Anyを使用するために定義しています
//
using System.Linq;
namespace Contais_Class
{
class Program
{
static void Main(string[] args)
{
Person[] ps =
{
new Person() { Id = 1, Name = "Max" },
new Person() { Id = 2, Name = "Headroom" }
};
if (ps.Contains(new Person() { Id = 1, Name = "Headroom" }, new PersonComparer()))
{
Console.WriteLine("見つかりました");
}
else
{
Console.WriteLine("見つかりませんでした");
}
//
// LinqのAnyメソッドで指定要素の有無が確認できる
//
if (ps.Any(c => c.Id == 1 && c.Name == "Max"))
{
Console.WriteLine("見つかりました");
}
else
{
Console.WriteLine("見つかりませんでした");
}
Console.ReadKey();
}
}
///
/// Personクラス
///
|
class Person { public int Id; public string Name; public override string ToString() { return string.Format(“Id:{0}, Name:{1}”, Id, Name); } } ///
1
2
3
|
/// Personクラスの等価比較を行うクラス
///
|
class PersonComparer : IEqualityComparer<Person> { public bool Equals(Person x, Person y) { if (x.Id == y.Id && x.Name == y.Name) { return true; } return false; } public int GetHashCode(Person obj) { return obj.Id; } } }
1
|
|
実行結果
1
2
3
4
|
見つかりませんでした
見つかりました
|
C#で正規表現にマッチする文字列が含まれているか検索するには?
C#で文字列が含まれているかを検索するにはRegexクラスで正規表現を使用して行うことが可能です。正規表現を使用することにより、検索対象の文字列を柔軟に指定することが可能となります。
正規表現を使いこなして汎用性の高い検索ができる
文字列検索を行う上では、正規表現を使いこなすことが重要になります。より汎用性の高い検索をする場合には、指定した文字列の完全一致、部分一致だけでは不十分なケースも出てくるほか、煩雑な処理になってしまうこともあるでしょう。正規表現はそれを解消できる手段になるので、検索条件が複雑になってしまう場合には、積極的に取り入れていくのがおすすめです。
Regexクラスの使い方
Regexクラスで正規表現を使用して指定文字列が含まれているかを検索する例をC#で示します。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
using System;
using System.Text.RegularExpressions;
namespace Contais_Array_Regex
{
class Program
{
static void Main(string[] args)
{
var strArry = new string[] { "Jan", "Feb", "Mar", "Apr" };
string str = string.Join(",", strArry);
string pattern = "[A|apr]";
Regex regex = new Regex(pattern);
if (regex.IsMatch(string.Join(",", strArry)))
{
Console.WriteLine("{0}が見つかりました", pattern);
}
else
{
Console.WriteLine("{0}は見つかりませんでした", pattern);
}
Console.ReadKey();
}
}
}
|
実行結果
1
2
3
|
[A|apr]が見つかりました
|
IndexOfメソッドの使い方
IndexOfメソッドは、対象となる文字列内に指定した文字列が何番目にあるのかを返します。該当する文字列が複数ある場合には、最初に該当する文字列のものが対象です。引数が検索対象文字列一つの場合は、先頭から最初に見つかった文字の位置を返す仕様で、省略可能な第二引数をint型nで指定すると、n番目に見つかった文字の位置を返します。また、このメソッドは、String型のほか、List型、配列型にも使用可能です。
文字列内に含まれている該当文字列位置を検索1
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
using System;
namespace Index_Test
{
class Test
{
static void Main()
{
string test_str = "この文字列はテスト用です。";
string search_str = "この";
Console.WriteLine(test_str.IndexOf(search_str));
}
}
}
|
実行結果
1
2
3
|
0
|
このコードでは、対象文字列が検索対象文字列のどの位置にあるかを番号で返します。
(配列などと同じく、開始番号は0からで見つからない場合は-1が返ります。)
文字列内に含まれている該当文字列位置を検索2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
using System;
namespace Index_Test2
{
class Test
{
static void Main()
{
string test_str = "このこのこのこのこのこの文字列";
string search_str = "この";
Console.WriteLine(test_str.IndexOf(search_str, 3));
}
}
}
|
実行結果
1
2
3
|
4
|
このコードでは、検索対象文字列が複数含まれている場合に、その対象文字が3番目にあたる部分がどの位置にあるかを返しています。
- プログラマー
- 汎用メソッドを使って簡単に検索できるんですね。
- プロジェクト
リーダー - 複雑な検索条件の場合には正規表現も使えるので、いろいろ試してみると良いですよ。
C#のContainsの使い方を覚えよう
ここまでC#でContainsメソッドを使用する例を取り上げてきました。実務でプログラムを作成するときには、文字列や配列、コレクションに対して特定の文字列の検索という処理が現れることが多くなります。
ぜひ実際に動かしてみてください。
FEnet.NETナビ・.NETコラムは株式会社オープンアップシステムが運営しています。
株式会社オープンアップシステムはこんな会社です
秋葉原オフィスには株式会社オープンアップシステムをはじめグループのIT企業が集結!
数多くのエンジニアが集まります。
-
スマホアプリから業務系システムまで
スマホアプリから業務系システムまで開発案件多数。システムエンジニア・プログラマーとしての多彩なキャリアパスがあります。
-
充実した研修制度
毎年、IT技術のトレンドや社員の要望に合わせて、カリキュラムを刷新し展開しています。社内講師の丁寧なサポートを受けながら、自分のペースで学ぶことができます。
-
資格取得を応援
スキルアップしたい社員を応援するために資格取得一時金制度を設けています。受験料(実費)と合わせて資格レベルに合わせた最大10万円の一時金も支給しています。
-
東証プライム上場企業グループ
オープンアップシステムは東証プライム上場「株式会社オープンアップグループ」のグループ企業です。
安定した経営基盤とグループ間のスムーズな連携でコロナ禍でも安定した雇用を実現させています。
株式会社オープンアップシステムに興味を持った方へ
株式会社オープンアップシステムでは、開発系エンジニア・プログラマを募集しています。
年収をアップしたい!スキルアップしたい!大手の上流案件にチャレンジしたい!
まずは話だけでも聞いてみたい場合もOK。お気軽にご登録ください。
C#新着案件New Job
-
システム開発/東京都新宿区/【WEB面談可/C#経験者/20代前半の方活躍中/経験1年以上の方活躍中】/在宅勤務
月給29万~34万円東京都新宿区(新宿駅) -
システム開発/東京都新宿区/【WEB面談可/C#経験者/20代後半~40代の方活躍中/経験年数不問】/在宅勤務
月給41万~50万円東京都新宿区(新宿駅) -
デバック、テスト項目の作成/神奈川県横浜市/【WEB面談可/C#経験者/20代前半の方活躍中/経験1年以上の方活躍中】/在宅勤務
月給29万~34万円神奈川県横浜市(桜木町駅) -
デバック、テスト項目の作成/神奈川県横浜市/【WEB面談可/C#経験者/20代後半~40代の方活躍中/経験年数不問】/在宅勤務
月給41万~50万円神奈川県横浜市(桜木町駅) -
基幹システム開発導入/東京都新宿区/【WEB面談可/C#経験者/20代前半の方活躍中/経験1年以上の方活躍中】/在宅勤務
月給29万~34万円東京都新宿区(西新宿駅) -
基幹システム開発導入/東京都新宿区/【WEB面談可/C#経験者/20代後半~40代の方活躍中/経験年数不問】/在宅勤務
月給41万~50万円東京都新宿区(西新宿駅)