C#でプログラミングを行っていると、特定の文字列や文字が「最後に出現する場所」を特定したい場面によく遭遇します。
例えば、ファイルパスからファイル名だけを抽出したり、URLの末尾のパラメータを解析したりする場合です。
このような時に欠かせないのがLastIndexOfメソッドです。
本記事では、LastIndexOfの基本的な使い方から、検索範囲の指定、大文字小文字の区別といった応用的なテクニックまで、初心者の方にもわかりやすく詳細に解説します。
LastIndexOfメソッドとは
LastIndexOfは、文字列(string)の中から指定した文字や文字列を末尾(後ろ)から検索し、最初に見つかった位置のインデックスを返すメソッドです。
C#のSystem.Stringクラスに用意されており、非常に頻繁に利用される標準的な機能です。

LastIndexOfの基本動作
このメソッドの最大の特徴は、「最後に見つかった位置」を「先頭からのインデックス番号」で返すという点にあります。
インデックスは0から始まるため、文字列の先頭は0番目となります。
文字(char)を検索する場合
単一の文字を検索する場合の最もシンプルなコード例を見てみましょう。
using System;
class Program
{
static void Main()
{
string text = "C# is fun, C# is powerful";
// 文字 '#' が最後に出現する位置を検索
int lastIndex = text.LastIndexOf('#');
Console.WriteLine($"対象文字列: {text}");
Console.WriteLine($"'#' の最後のインデックス: {lastIndex}");
}
}
対象文字列: C# is fun, C# is powerful
'#' の最後のインデックス: 12
文字列(string)を検索する場合
一文字だけでなく、特定の単語(部分文字列)を検索することも可能です。
using System;
class Program
{
static void Main()
{
string text = "banana, apple, orange, apple";
// 文字列 "apple" が最後に出現する位置を検索
int lastIndex = text.LastIndexOf("apple");
Console.WriteLine($"対象文字列: {text}");
Console.WriteLine($"\"apple\" の最後のインデックス: {lastIndex}");
}
}
対象文字列: banana, apple, orange, apple
"apple" の最後のインデックス: 23
見つからない場合の戻り値
検索した文字や文字列が対象の中に存在しない場合、LastIndexOfメソッドは-1を返します。
この仕様は、プログラミングにおいて「見つからなかったこと」を判定するための重要なフラグとなります。
-1を利用した条件分岐
実務では、検索結果が-1でないことを確認してから後続の処理を行うのが一般的です。
using System;
class Program
{
static void Main()
{
string text = "Hello World";
int index = text.LastIndexOf("C#");
if (index != -1)
{
Console.WriteLine($"見つかりました。位置は {index} です。");
}
else
{
Console.WriteLine("指定された文字列は見つかりませんでした。");
}
}
}
指定された文字列は見つかりませんでした。
検索範囲を詳細に指定する
LastIndexOfは単純に全体を検索するだけでなく、「どこから探し始めるか」や「何文字分遡るか」を指定することができます。
ただし、この際のパラメータの指定方法には少し注意が必要です。

検索開始位置(startIndex)の指定
LastIndexOf(value, startIndex) という形式で使用します。
ここで指定する startIndex は、「検索を開始する位置(そこから左に向かって探す)」という意味になります。
using System;
class Program
{
static void Main()
{
// インデックス: 01234567890
string text = "A-B-C-A-B-C";
// インデックス7('B')から左に向かって 'A' を探す
int index = text.LastIndexOf('A', 7);
Console.WriteLine($"検索結果のインデックス: {index}");
}
}
検索結果のインデックス: 6
上記の例では、インデックス7から左側(0方向)を探索するため、インデックス9にある最後の’A’は無視され、インデックス6にある’A’が見つかります。
検索文字数(count)の指定
さらに、LastIndexOf(value, startIndex, count) を使うことで、検索対象とする範囲(文字数)を制限できます。
| 引数名 | 意味 |
|---|---|
| value | 検索する文字または文字列 |
| startIndex | 検索を開始する位置(この位置から左へ戻る) |
| count | 検索対象に含める文字数 |
大文字と小文字を区別せずに検索する
デフォルトのLastIndexOfは大文字と小文字を厳密に区別します。
しかし、ユーザー入力の検索などでは区別したくない場合もあります。
その際は、StringComparison 列挙型を使用します。
StringComparisonの活用
using System;
class Program
{
static void Main()
{
string text = "Visual Studio, visual basic";
// 大文字小文字を区別しない検索
int index = text.LastIndexOf("VISUAL", StringComparison.OrdinalIgnoreCase);
Console.WriteLine($"検索結果: {index}");
}
}
検索結果: 15
StringComparison.OrdinalIgnoreCaseを指定することで、大文字の “VISUAL” を検索しても、末尾付近にある小文字の “visual” を正しく見つけることができます。
IndexOfとLastIndexOfの比較
これら二つのメソッドは非常によく似ていますが、検索の方向が異なります。

違いをコードで確認する
using System;
class Program
{
static void Main()
{
string data = "ID123-NAME-ID456";
int firstID = data.IndexOf("ID");
int lastID = data.LastIndexOf("ID");
Console.WriteLine($"最初のIDの位置: {firstID}"); // 0
Console.WriteLine($"最後のIDの位置: {lastID}"); // 11
}
}
最初のIDの位置: 0
最後のIDの位置: 11
実践的な活用シーン
LastIndexOfが最も威力を発揮するのは、区切り文字が複数含まれる文字列の末尾要素を取得するときです。
ファイルパスから拡張子やファイル名を取得する
ファイルパスにはディレクトリを区切るための「\」や「/」が複数含まれますが、ファイル名は常に最後の区切り文字の後にあります。
using System;
class Program
{
static void Main()
{
string filePath = @"C:\Users\Documents\Projects\Report.pdf";
// 最後の '\' の位置を見つける
int lastSeparator = filePath.LastIndexOf('\\');
if (lastSeparator != -1)
{
// 区切り文字の直後から最後までを切り出す
string fileName = filePath.Substring(lastSeparator + 1);
Console.WriteLine($"ファイル名: {fileName}");
}
}
}
ファイル名: Report.pdf
このように、Substringメソッドと組み合わせることで、特定の構造を持つ文字列から必要なデータだけを効率よく抽出できます。
まとめ
C#のLastIndexOfメソッドは、文字列を後ろから検索し、最後に出現する特定要素の位置を特定するための強力なツールです。
基本的な使い方はもちろん、検索が見つからない場合は -1 を返すことや、検索方向が先頭に向かって進むという特性を理解しておくことが重要です。
また、実務においては大文字小文字の区別設定や、ファイルパス解析のような具体的な用途で頻繁に利用されます。
本記事で紹介した検索範囲の指定方法や、他の文字列操作メソッドとの組み合わせを活用して、より柔軟で堅牢なコードを記述できるようになりましょう。
