string型のメソッド

文字列操作のためのメソッド

C#では文字列を扱う専用のデータ型としてstring型が用意されています。
string型は、変数に文字列を保存できるだけでなく、文字列の一部取り出しや加工などの便利な機能が用意されています。

ここでは比較的よく使用するメソッド(関数)を紹介します。
すべてではないのでご注意ください。

なお、ごく基本的な事柄は文字と文字列でも説明しているので、まだ読んでいない方はそちらを先にお読みください。

パス文字列を操作する場合は専用のメソッドを使用したほうが良い場合があります。
詳しくはパス操作を参照してください。

以下の説明でstring.○○の形式のものは静的メソッドです。
メソッド名から始まるものはインスタンスメソッドです。
(→静的メソッドとインスタンスメソッド)

string型の基本

文字と文字列でも説明している基本的な事柄を簡単におさらいしておきます。


//初期化
string str = "abc";

//代入
str = "def";

//文字列結合
str += "ghi" //"defghi"

//一文字取り出し(char型)
char c = str[1]; //'e'

//文字列の長さ(int型)
int length = str.Length; //6

//空文字
str = string.Empty;

//null
str = null;

//空文字のチェック
if(str == string.Empty) {}

//nullのチェック
if(str == null) {}

//nullまたは空文字のチェック
if(string.IsNullOrEmpty(str)) {}

string型に限らず、nullは特殊な値です。
nullが代入された状態のstring型変数に対してはインスタンスメソッドは適用できません。
(Lengthなどのプロパティも使用できない)


string str = null;

//エラー
//str.Equals("abc");

//OK
string.Equals(str, "abc");

特殊な初期化方法

あまり使用頻度は高くないですが、以下のような初期化も可能です。


char[] chars = new char[] { 'a', 'b', 'c', 'd', 'e' };

//char型配列をstring型に変換して代入
string str1 = new string(chars);

//char型配列の1文字目から3文字目までを
//string型に変換して代入
string str2 = new string(chars, 1, 3);

//文字「a」を10文字代入
string str3 = new string('a', 10);

「new」についてはクラスの基礎で説明します。

「string」と「String」

C#ではstringStringという二つのデータ型が存在しますが、これらは同じものと考えて構いません。
「string」は「String」の別名です。

例えば空文字を表すEmptyプロパティはstring.EmptyString.Emptyのどちらでも書けますし、内容も同じです。


string empty1 = string.Empty;
string empty2 = String.Empty;

string型文字列は不変

文字列に対して追加や削除等を行うメソッドは多数ありますが、これらのメソッドは元の文字列を変更しません。
C#ではstring型の文字列は変更不可で、文字列に変更を加える場合は新しい文字列を生成して返します。

string型文字列を変更できないのはメソッドに限らず、直接編集することもできません。


string s = "abc";

//個別に文字を取り出すことはできる
char c = s[0];

//書き換えはできない
//s[0] = 'a';

//"abc"とは別に、
//"abcdef"という新しい文字列が生成される
s += "def";

検索、比較メソッドについて

文字列の検索や比較メソッドは、その比較方法にいくつかの種類が存在します。
いくつかのメソッドではStringComparisonという列挙体で比較方法を指定できます。

この列挙体の各値の意味はオブジェクトの比較#StringComparerを参照して下さい。
「StringComparison」と「StringComparer」という違いはありますが、値の意味は同じです。

ここでは簡単に以下の4つを説明します。

定数 説明
Ordinal カルチャに依存しない比較
OrdinalIgnoreCase カルチャに依存しない大文字小文字を無視した比較
CurrentCulture 現在のカルチャに依存する比較
CurrentCultureIgnoreCase 現在のカルチャに依存する大文字小文字を無視した比較

カルチャというのは国や地域によって異なる情報のことです。
例えば日本語カルチャでは「あいうえお」と「アイウエオ」は同じものと判定されます。

StringComparison.Ordinalがデフォルトの動作です。
大文字小文字を無視した比較を行いたい場合はStringComparison.OrdinalIgnoreCaseを使用します。
これらは文字を単純なバイト列で比較するので、おおむね見た目通りの結果になります。
カルチャ依存の比較は思った通りの結果にならないことも多いので、特性をよく調べた上で使用した方が良いでしょう。

結合

string.Concat(文字列の結合)

string.Concatメソッドは文字列を結合します。


string str1 = "acb";
string str2 = "def";

string concat1 = string.Concat(str1, str2);
string concat2 = string.Concat(str1, ", ", str2);

Console.WriteLine(concat1);
Console.WriteLine(concat2);
abcdef
abc, def

+演算子による結合とstring.Concatメソッドによる結合には違いは無いようなので好きな方を使用してください。

string.Join(文字列配列の結合)

string.Joinメソッドはstring型配列の要素を区切り文字を用いて結合します。


string[] strs = new string[]
{
    "Apple",
    "Grape",
    "Orange"
};

string join = string.Join(":", strs);

Console.WriteLine(join);
Apple:Grape:Orange

第一引数は区切り文字に使用する文字列を指定します。
第二引数は連結したいstring型配列を指定します。
戻り値は区切り文字で連結された文字列です。

第一引数は.NET Frameworkでは「文字列」のみ指定可能ですが、.NET Coreでは「文字」(char型)も指定可能です。

もし区切り文字が必要ない場合は空文字に第一引数を指定します。


string[] strs = new string[]
{
    "Apple",
    "Grape",
    "Orange"
};

string join = string.Join(string.Empty, strs);

Console.WriteLine(join);
AppleGrapeOrange

結合開始要素(startIndex)と結合要素数の指定(count)

第三引数と第四引数に数値を指定することで、結合する要素の開始番号(startIndex)と、結合する要素数(count)を指定することができます。


string[] strs = new string[]
{
    "Apple",
    "Grape",
    "Orange",
    "Strawberry",
    "Peach"
};

//配列の1番目の要素から3つ分を結合
string join = string.Join(":", strs, 1, 3);

Console.WriteLine(join);
Grape:Orange:Strawberry

サンプルコードでは「要素の開始番号1から3つ分」の文字列を結合しています。

要素の開始番号は「0」であることに注意してください。

Insert(文字列の挿入)

Insertメソッドは、文字列の指定の位置に別の文字列を挿入した文字列を返します。


string str = "This is a pen";

string strInsert = str.Insert(10, "red ");
Console.WriteLine(strInsert);
This is a red pen

第一引数は文字列を挿入する位置番号です。
(先頭は0文字目)
第二引数は挿入する文字列です。
戻り値は新しい文字列です。

位置番号が元の文字列の文字数より大きい、または0未満の場合は実行時エラーになります。

PadLeft、PadRight(文字列の空白詰め)

PadLeftメソッドは、指定の文字数に達するまで文字列の左側を空白で埋めます。
PadRightメソッドは右端を空白で埋めます。


string str1 = "abc";
string str2 = "abc";

str1 = str1.PadLeft(5);
str2 = str2.PadRight(5);

Console.WriteLine("'{0}'", str1);
Console.WriteLine("'{0}'", str2);    
'  abc'
'abc  '

数値の桁数を合わせる時などに便利です。

指定の文字で埋める

第二引数に文字(char型)を指定すると、空白の代わりにその文字で埋められます。


string str1 = "1";
string str2 = "20";

str1 = str1.PadLeft(4, '0');
str2 = str2.PadLeft(4, '*');

Console.WriteLine(str1);
Console.WriteLine(str2);
0001
20**

削除

Remove(文字列の部分削除)

Removeメソッドは、文字列から一部を削除した文字列を返します。


string str = "I have a pen";

//6文字目から末尾まで削除
string remove1 = str.Remove(6);

//6文字目から3文字を削除
string remove2 = str.Remove(6, 3);

Console.WriteLine(remove1);
Console.WriteLine(remove2);
I have 
I havepen

Trim、TrimStart、TrimEnd(先頭および末尾の空白の除去)

Trimメソッドは、文字列の前後にある空白文字を除去します。
TrimStartメソッドは、文字列の先頭の空白文字を除去します。
TrimEndメソッドは、文字列の末尾の空白文字を除去します。


string str = "  I have a pen  ";

string trim = str.Trim();
string trimStart = str.TrimStart();
string trimEnd = str.TrimEnd();

Console.WriteLine("'{0}'", trim);
Console.WriteLine("'{0}'", trimStart);
Console.WriteLine("'{0}'", trimEnd);
'I have a pen'
'I have a pen  '
'  I have a pen'

空白とみなされる文字は結構多く、半角スペース、全角スペース、タブ文字、改行など、人が読む「文字」として表示されないものは大体当てはまります。

指定文字を削除する

特定の文字を除去対象にするには引数に文字(char型)を指定します。
これは複数同時に指定可能です。


string str = " I have a pen.; ";

//「I have a pen」
string trim1 = str.Trim(' ', '.', ';');
//メソッドチェーンでつなげても良い
string trim2 = trim.Trim().Trim('.', ';');

引数に文字を指定すると、その文字だけが削除対象になります。
つまり半角スペースなどは削除対象にならなくなるので、従来通り除去したい場合は明示的に指定する必要があります。
もしくは引数なしでTrimメソッドを実行し、メソッドチェーンでさらに除去したい文字を指定してTrimメソッドを実行する方法もあります。

なお、文字列の途中に指定文字があっても除去されません。
あくまでも文字の前後の不要文字を除去するメソッドです。


string str = " I have a pen ";

//「have a pen」
string trim = str.Trim(' ', 'I', 'a');

置き換え

Replace(文字列の置き換え)

Replaceメソッドは、文字列の一部を別の文字列で置き換えた文字列を返します。


string str = "I have a pen";

string replace1 = str.Replace("a pen", "an apple");

//半角スペースをすべて削除
string replace2 = str.Replace(" ", string.Empty);
//「文字」も指定できる
string replace3 = str.Replace(' ', '\0');

Console.WriteLine(replace1);
Console.WriteLine(replace2);
Console.WriteLine(replace3);
I have an apple
Ihaveapen
Ihaveapen

第一引数は置き換え対象にする文字列を指定します。
この文字列に一致した箇所を、第二引数で置き換えた文字列を返します。

第二引数に空文字を指定すると特定の文字列の一括削除ができます。

対象が一文字の場合は、第一、第二引数に文字(char型)を指定することもできます。

これらは第三引数にStringComparisonが指定可能です。
また、第三引数に大文字小文字を無視するかの真偽値(trueなら無視)を指定し、第四引数にCultureInfoというカルチャ情報を格納するクラスを指定するオーバーロードもあります。
ただしこれらのオーバーロードでは第一、第二引数にchar型を指定することはできず、また、.NET Frameworkでは使用できません。

ReplaceLineEndings(改行の置き換え)

ReplaceLineEndingsメソッドは、文字列の全ての改行文字を現在の環境の改行文字に置き換えた文字列を返します。
このメソッドは.NET6以降で使用できます。


static void ShowStringWithWordBreak(string s)
{
    foreach (var c in s)
    {
        if (c == '\r')
            Console.Write("\\r");
        else if (c == '\n')
            Console.Write("\\n");
        else
            Console.Write(c);
    }
    Console.WriteLine();
}

static void Main(string args[])
{
    string str = "ABC\nDEF\rGHI\r\n";
    ShowStringWithWordBreak(str);
    
    string strRplace = str.ReplaceLineEndings();
    ShowStringWithWordBreak(strRplace);
}
ABC\nDEF\rGHI\r\n
ABC\r\nDEF\r\nGHI\r\n

改行文字はOSによって\r\n\r\nの三種類がありますが、これらを現在の環境で使用されている改行文字に置き換えます。
サンプルコードはWindowsでの実行結果です。

なお、Environment.NewLineというプロパティには現在の環境での改行文字が格納されています。
(読み取り専用プロパティ)
\rは古いMacOSでの改行文字ですが、これは.NETが動く環境ではないためか、このプロパティが\rを返すことはないようです。


ShowStringWithWordBreak(Environment.NewLine);

static void ShowStringWithWordBreak(string s)
{
    foreach (var c in s)
    {
        if (c == '\r')
            Console.Write("\\r");
        else if (c == '\n')
            Console.Write("\\n");
        else
            Console.Write(c);
    }
    Console.WriteLine();
}
\r\n

※Windowsでの実行結果。

分割

Split(区切り文字で文字列を分割)

Splitメソッドは、文字列を区切り文字で分割し、それぞれを要素に格納した配列を返します。


string str = "Apple,Grape,Orange";

string[] split = str.Split(',');

for (int i = 0; i < split.Length; i++)
    Console.WriteLine(split[i]);
Apple
Grape
Orange

戻り値は文字列配列です。

複数の文字を指定

引数の区切り文字は複数同時に指定可能です。


string str = "5+6-2=9";

string[] split = str.Split('+', '-', '=');
//配列でも良い
//string[] split = str.Split(new char[] { '+', '-', '=' });

for (int i = 0; i < split.Length; i++)
    Console.WriteLine(split[i]);
5
6
2
9

返される配列の要素数の制限(count)

区切り文字として使用する文字をchar型配列にして第一引数に指定し、第二引数に数値(count)を指定すると、戻り値の配列の要素数を制限することができます。


string str = "5+6-2=9";

string[] split = str.Split(
    new char[] { '+', '-', '=' }, 3);

for (int i = 0; i < split.Length; i++)
    Console.WriteLine(split[i]);
5
6
2=9

サンプルコードでは戻り値の配列の要素数が「3」になった時点で処理を停止し配列を返却しています。

空の要素を削除した配列を返す

Splitメソッドは、文字列の分割によって戻り値の配列に空の要素(文字数ゼロ)が含まれることがあります。
以下のサンプルコードでは、配列のサイズは「5」ですが、split[1]split[3]の中身は空文字です。


string str = "Apple, Grape, Orange";

string[] split = str.Split(
    new char[] { ',', ' ' });

for (int i = 0; i < split.Length; i++)
    Console.WriteLine(split[i]);
Apple

Grape

Orange

この空の要素を戻り値の配列に含めない場合はStringSplitOptions.RemoveEmptyEntriesを使用します。


string str = "Apple, Grape, Orange";

string[] split = str.Split(
    new char[] { ',', ' ' },
    StringSplitOptions.RemoveEmptyEntries);

for (int i = 0; i < split.Length; i++)
    Console.WriteLine(split[i]);
Apple
Grape
Orange

文字列の分割の結果、文字数がゼロになる要素は戻り値から省かれ、戻り値の配列サイズが「3」になっています。

区切り文字に文字列を指定

区切り文字に文字ではなく文字列を指定するには以下のようにします。


string str = "Apple, Grape, Orange";

string[] split = str.Split(
    new string[] { ", " },
    StringSplitOptions.None);

for (int i = 0; i < split.Length; i++)
    Console.WriteLine(split[i]);
Apple
Grape
Orange

まず、区切り文字として使用したい文字列を配列にします。
(たとえ一つしかない場合でも配列にする必要があります)
さらに、第二引数にStringSplitOptions.NoneStringSplitOptions.RemoveEmptyEntriesのいずれかを渡します。

Noneは戻り値の配列に空の要素が含まれていてもそのまま返します。
RemoveEmptyEntriesは空の要素は省いて返します。

部分文字列

CopyTo(文字列の部分コピー)

CopyToメソッドは、文字列の一部をchar型配列にコピーします。


string str = "abcdef";
char[] chars = new char[str.Length];
Array.Fill(chars, '0'); //全てを'0'で埋める

//0文字目から、配列の0番目に文字数-2文字分のコピー
str.CopyTo(0, chars, 0, chars.Length - 2);

foreach (char c in chars)
    Console.Write(c);
abcd00

第一引数は文字列のコピー開始位置です。
第二引数はコピー先の配列です。
第三引数はコピーする文字数です。

文字列の一部をstring型文字列で取り出したい場合はSubStringを使用します。

SubString(文字列の部分取得)

SubStringメソッドは、文字列から一部の文字列をコピーした新しい文字列を返します。


string str = "I have a pen";

//7文字目から末尾まで取得
string subString1 = str.Substring(7);

//7文字目から3文字を取得
string subString2 = str.Substring(7, 3);

Console.WriteLine(subString1);
Console.WriteLine(subString2);
a pen
a p

第一引数はコピー開始位置です。
第二引数でコピーする文字数を指定することもできます。

変換

ToUpper、ToLower(大文字、小文字に変換)

ToUpperメソッドは文字列を大文字に変換します。
ToLowerメソッドは文字列を小文字に変換します。


string str = "I have a pen";

//I HAVE A PEN
string strUpper = str.ToUpper();

//i have a pen
string strLower = str.ToLower();

戻り値はどちらも変換後の文字列です。

引数にCultureInfoというカルチャ情報を格納するクラスを指定することもできます。

ToCharArray(文字列を文字配列に変換)

ToCharArrayメソッドは、文字列をchar型の配列に変換します。


string str = "This is a pen";
char[] chars = str.ToCharArray();

Console.WriteLine("{0}文字", chars.Length);
foreach (char c in chars)
{
    Console.Write(c);
}    
13文字
This is a pen

第一引数に開始位置、第二引数に文字数を指定することで文字列の範囲を配列に変換することもできます。


string str = "This is a pen";

//5文字目から2文字分の配列を作成
char[] chars = str.ToCharArray(5, 2);

Console.WriteLine("{0}文字", chars.Length);
foreach (char c in chars)
{
    Console.Write(c);
}
2文字
is

比較

string.IsNullOrEmpty(nullおよび空文字チェック)

string.IsNullOrEmptyメソッドは引数の文字列がnullもしくは空文字の場合に真(true)を返します。


string str1 = "I have a pen";
string str2 = "";
string str3 = null;

Console.WriteLine(string.IsNullOrEmpty(str1));
Console.WriteLine(string.IsNullOrEmpty(str2));
Console.WriteLine(string.IsNullOrEmpty(str3));
False
True
True

string.IsNullOrWhiteSpace(nullおよび空白文字チェック)

string.IsNullOrWhiteSpaceメソッドは引数の文字列がnullもしくは空白文字(空文字ではない)の場合に真(true)を返します。
このメソッドは.NET Framework4.0から使用できます。
(.NET Coreでは1.0から使用可能)


string str1 = "I have a pen";
string str2 = "";
string str3 = null;
string str4 = " \t "; //半角スペース、タブ文字、全角スペース

Console.WriteLine(string.IsNullOrWhiteSpace(str1));
Console.WriteLine(string.IsNullOrWhiteSpace(str2));
Console.WriteLine(string.IsNullOrWhiteSpace(str3));
Console.WriteLine(string.IsNullOrWhiteSpace(str4));
False
True
True
True

Equals(文字列の等値判定)

Equalsメソッドは、文字列全体の一致を判定します。


string str = "Pencil";

bool op = str == "Pencil";          //true
bool equals = str.Equals("Pencil"); //true

このメソッドは等値演算子(==)による比較と同じ結果となりますが、第二引数にStringComparisonを指定することで比較方法を変更できます。
例えば大文字文字を無視した比較はStringComparison.OrdinalIgnoreCaseを指定します。


string str = "Pencil";

//false
bool op = str == "pencil";

//true
bool equals = str.Equals("pencil", StringComparison.OrdinalIgnoreCase);

string.Equals

Equalsメソッドには静的メソッド版のstring.Equalsメソッドもあります。


string str = null;

bool equals = string.Equals(str, null); //true

インスタンスメソッド版の場合、実行対象の変数の中身がnullの場合は実行時エラーになりますが、静的メソッド版は確実な比較が可能です。

string.Equalsメソッドは第三引数にStringComparisonが指定可能です。

string.Compare(文字列の順序比較)

string.Compareメソッドは二つの文字列を比較し、並べ替えに使用する順序を整数で返します。


string str1 = "Apple";
string str2 = "Orange";
string str3 = "Grape";

Console.WriteLine(string.Compare(str1, str2));
Console.WriteLine(string.Compare(str2, str3));
Console.WriteLine(string.Compare(str1, str1));
-1
1
0

「Apple」と「Orange」をアルファベット順に並べた時、「Apple」のほうが順序が先になります。
この場合string.Compareメソッドは負数(マイナス値)を返します。

「Orange」と「Grape」をアルファベット順に並べた時、「Grape」のほうが順序が先になります。
この場合string.Compareメソッドは正数(プラス値)を返します。

比較する文字列が同一の時はstring.Compareメソッドは「0」を返します。

このメソッドは主に配列などの並び替え時に使用します。
単純に二つの文字列が同一か否かを判定する場合はEqualsメソッドを使用すべきです。

部分比較

string.Compareメソッドは、文字列の部分比較が可能です。
引数はコメントを参照してください。


string str1 = "This is a pen.";
string str2 = "This is an apple.";

//str1の0文字目から9文字分と、
//str2の0文字目から9文字分を比較
Console.WriteLine(
    string.Compare(str1, 0, str2, 0, 9));

//str1の0文字目から10文字分と、
//str2の0文字目から10文字分を比較
Console.WriteLine(
    string.Compare(str1, 0, str2, 0, 10));
0
-1

大文字小文字を区別しない

string.Compareメソッドは第三引数にtrue、またはStringComparison.OrdinalIgnoreCaseを指定することで大文字小文字に依存しない判定も可能です。
部分比較をする場合は引数の最後にこれらの値を指定します。


Console.WriteLine(
    string.Compare("Apple", "apple", true));
Console.WriteLine(
    string.Compare("Apple", "apple", StringComparison.OrdinalIgnoreCase));

Console.WriteLine(
    string.Compare("Apply", 0, "apple", 0, 4, true));
Console.WriteLine(
    string.Compare("Apply", 0, "apple", 0, 4, StringComparison.OrdinalIgnoreCase));
0
0
0
0

CompareTo(文字列の順序比較)

CompareToメソッドはstring.Compareのインスタンスメソッド版です。
基本的な動作は同じですが、部分比較や大文字小文字を無視した比較はできません。


string str1 = "Apple";
string str2 = "Orange";
string str3 = "Grape";

Console.WriteLine(str1.CompareTo(str2));
Console.WriteLine(str2.CompareTo(str3));
Console.WriteLine(str1.CompareTo(str1));
-1
1
0

string.CompareOrdinal(序数による文字列の順序比較)

string.CompareOrdinalメソッドは、序数を使用した文字列の比較を行います。
これはstring.CompareメソッドにStringComparison.Ordinalを指定した場合と同じ動作となります。


string str1 = "Apple";
string str2 = "Orange";
string str3 = "Grape";

Console.WriteLine("{0},\t{1}\t= {2}", str1, str2, string.CompareOrdinal(str1, str2));
Console.WriteLine("{0},\t{1}\t= {2}", str2, str3, string.CompareOrdinal(str2, str3));
Console.WriteLine("{0},\t{1}\t= {2}", str1, str1, string.CompareOrdinal(str1, str1));
Console.WriteLine();

string str4 = "This is a pen.";
string str5 = "This is an apple.";

//str4の0文字目から9文字分と、
//str5の0文字目から9文字分を比較
Console.WriteLine(
    "'{0}'の{1}文字目から{4}文字分と、\n" +
    "'{2}'の{3}文字目から{4}文字分の比較結果は「{5}」です。"
    , str4, 0, str5, 0, 9,
    string.CompareOrdinal(str4, 0, str5, 0, 9));
Apple,  Orange  = -14
Orange, Grape   = 8
Apple,  Apple   = 0

'This is a pen.'の0文字目から9文字分と、
'This is an apple.'の0文字目から9文字分の比較結果は「0」です。

上記コードのように比較開始位置と比較文字数の指定は可能ですが、大文字小文字を無視した比較はできません。

検索

IndexOf(文字列の検索)

IndexOfメソッドは、文字列内から特定の文字、文字列を検索しその位置を返します。


string str = "abcde";

int index1 = str.IndexOf('d'); //3
int index2 = str.IndexOf('z'); //-1
int index3 = str.IndexOf("cde"); //2

IndexOfメソッドは、先頭文字を0文字目として先頭から引数に指定した文字(char型)または文字列(string型)を検索し、見つかった位置を返します。
文字が見つからなかった場合は「-1」を返します。

文字列の途中から検索する(startIndex)

IndexOfの第二引数に数値(startIndex)を指定することで、文字列の途中から検索が可能です。


string str = "I have a pen";
int index = 0;

//'a'が登場する位置を全て表示
while ((index = str.IndexOf('a', index)) >= 0)
{
    Console.WriteLine(index);
    ++index;
}
3
7

検索対象の文字が見つかったら、見つかった位置に1を加算(インクリメント)し、次の文字から再度検索することで文字列の末尾まで検索しています。

検索文字数を制限する(count)

検索開始位置(startIndex)を指定する場合、さらに検索する文字数を制限(count)することができます。


string str = "I have a pen";

//0文字目から末尾まで検索
int index1 = str.IndexOf('a', 0); //3

//0文字目から3文字までを検索
int index2 = str.IndexOf('a', 0, 3); //-1

7行目の検索は先頭から3文字分、つまり「I h」までが検索対象です。
その範囲に文字「a」はないため、-1を返します。

StringComparison

IndexOfメソッドのいずれのオーバーロードも、引数の最後にStringComparisonを指定できます。


string str = "Apple, Grape, Orange";

int index1 = str.IndexOf("a");
int index2 = str.IndexOf("a", StringComparison.OrdinalIgnoreCase);

Console.WriteLine(index1);
Console.WriteLine(index2);
9
0

ただしこの場合、検索文字にchar型は指定できなくなります。
(一文字であってもstring型を使用する)

なお、大文字小文字を区別しないで検索するには、あらかじめToUpperToLowerメソッドで大文字、小文字に変換してから検索するという方法もあります。
しかし一旦変換する処理が入るので、速度的にはStringComparison.OrdinalIgnoreCaseのほうが有利です。


string str = "Apple, Grape, Orange";

//小文字に変換してから検索
int index1 = str.ToLower().IndexOf("a");

LastIndexOf(文字列の後方検索)

IndexOfメソッドは文字列を先頭から検索しますが、LastIndexOfメソッドは末尾から検索します。


string str = "I have a pen";

int index = str.IndexOf('a'); //3

int lastIndex = str.LastIndexOf('a'); //7

あくまでも「文字列を後ろから検索」するだけで、返される値は「先頭から数えた文字数」なので注意してください。

検索開始位置(startIndex)、検索文字数(count)、およびStringComparisonの指定はIndexOfメソッドと同じです。

IndexOfAny(複数の文字の検索)

IndexOfAnyメソッドは、第一引数に指定されたchar型配列内のいずれかの文字が最初に出現する位置を文字列から検索します。


string str = "I have a pen";
char[] chars = new char[] { 'a', 'h', 'p' };

int index1 = str.IndexOfAny(chars); //2

//startIndex
//5文字目から末尾までを検索
int index2 = str.IndexOfAny(chars, 5); //7

//startIndex, count
//5文字目から2文字分を検索
int index3 = str.IndexOfAny(chars, 5, 2); //-1

複数の文字を同時に検索対象にできる以外はIndexOfと同じです。
検索開始位置(startIndex)や検索文字数(count)を使用した検索もできます。
ただし文字列(string型)の検索と、StringComparisonを使用した検索はできません。

LastIndexOfAny(複数の文字の後方検索)

LastIndexOfAnyメソッドは、IndexOfAnyの後方検索版です。
IndexOfLastIndexOfの関係と同じです。


string str = "I have a pen";
char[] chars = new char[] { 'a', 'h', 'p' };

int index1 = str.LastIndexOfAny(chars); //9

//startIndex
int index2 = str.LastIndexOfAny(chars, 5); //3

//startIndex, count
int index3 = str.LastIndexOfAny(chars, 5, 2); //-1

Contains(部分一致)

Containsメソッドは、文字列内に特定の文字、文字列が含まれるかを判定します。


string str = "I have a pen";

Console.WriteLine(str.Contains("ve a"));
Console.WriteLine(str.Contains("apen"));
Console.WriteLine(str.Contains('a')); //char型も指定可能
//大文字小文字無視
Console.WriteLine(str.Contains('i', StringComparison.OrdinalIgnoreCase));
True
False
True
True

IndexOfメソッドのように文字の位置を返すのではなく、「含まれるか否か」をbool型で返します。
位置情報が必要ない場合はこちらが便利です。

第二引数にStringComparisonを指定することも可能です。
ただし.NET Frameworkではこのオーバーロードは使用できません。
替わりにIndexOfメソッドなどで一致判定を行います。


string str = "I have a pen";

//.NET Frameworkではコンパイルエラー
//Console.WriteLine(str.Contains('i', StringComparison.OrdinalIgnoreCase));

//OK
Console.WriteLine(str.IndexOf('i', StringComparison.OrdinalIgnoreCase) >= 0);
True

StartsWith、EndsWith(前方一致、後方一致)

StartsWithメソッドは、文字列が特定の文字列で開始するかを判定します。
EndsWithメソッドは、文字列が特定の文字列で終了するかを判定します。


string str = "I have a pen";

Console.WriteLine(str.StartsWith("I h"));
Console.WriteLine(str.StartsWith("have"));

Console.WriteLine(str.EndsWith("en"));
Console.WriteLine(str.EndsWith("a"));
Console.WriteLine(str.EndsWith('n')); //char型も指定可能
True
False
True
False
True

これらは第二引数にStringComparisonが指定可能です。
また、第二引数に大文字小文字を無視するかの真偽値(trueなら無視)を指定し、第三引数にCultureInfoというカルチャ情報を格納するクラスを指定するオーバーロードもあります。
ただしこれらのオーバーロードでは第一引数にchar型を指定することはできません。

フォーマット文字列

string.Format(文字列の書式指定)

string.Formatメソッドは文字列を書式に従って整形することができます。
このメソッドの使用方法は非常に多岐に渡るので、string.Formatメソッドの項で改めて説明します。