文字列内の各文字へのアクセス
C#で文字列を扱う際、文字列全体としてではなく、その文字列を構成する「1文字ずつ」にアクセスして処理を行いたい場合があります。例えば、特定の文字(例: '-')がいくつ含まれているか数えたり、文字列内の数字だけを抽出したり、各文字を個別に検証したりするケースです。
string型は、foreachループを使って直接繰り返し処理を行うことができます。
stringとforeachループ
C#において、string(文字列)型は、char(文字)型の読み取り専用のコレクション(集合体)として扱うことができます。
そのため、配列やList<T>を処理するのとまったく同じ構文(foreach)で、文字列の先頭から末尾まで1文字ずつ順番に取り出して処理することが可能です。
foreachによる文字の反復処理
foreachループを使用すると、インデックス(i)の管理や文字列の長さ(Length)を気にする必要がなく、コードが非常に簡潔になります。
コード例1: 1文字ずつ出力する
文字列内の各文字の間に区切り文字(例: |)を挿入して出力する基本的な例です。
using System;
public class ForeachCharacterExample
{
public static void Main()
{
string productCode = "SKU-1024-B";
Console.WriteLine($"元の文字列: {productCode}");
Console.Write("処理結果: ");
// foreach ループで文字列を1文字ずつ処理
foreach (var character in productCode)
{
// 'character' 変数は char 型
Console.Write($"[{character}]");
}
Console.WriteLine();
}
}
出力結果:
元の文字列: SKU-1024-B
処理結果: [S][K][U][-][1][0][2][4][-][B]
応用例:特定の文字をカウントする
foreachループは、if文と組み合わせることで、文字列の「中身」を分析するのに役立ちます。
コード例2: 文字の種類を判別する
入力されたシリアルキーに含まれる「アルファベット」、「数字」、「ハイフン」の数をそれぞれカウントする例です。char型にはIsLetter(アルファベットか)やIsDigit(数字か)といった判定メソッドが用意されています。
using System;
public class CharacterCounterExample
{
public static void Main()
{
string serialKey = "ABC-909-XYZ-123";
int letterCount = 0;
int digitCount = 0;
int hyphenCount = 0;
// 文字列 (serialKey) を1文字 (keyChar) ずつ処理
foreach (var keyChar in serialKey)
{
if (char.IsLetter(keyChar)) // アルファベットか?
{
letterCount++;
}
else if (char.IsDigit(keyChar)) // 数字か?
{
digitCount++;
}
else if (keyChar == '-') // ハイフンか?
{
hyphenCount++;
}
}
Console.WriteLine($"シリアルキー: {serialKey}");
Console.WriteLine($"アルファベットの数: {letterCount}");
Console.WriteLine($"数字の数: {digitCount}");
Console.WriteLine($"ハイフンの数: {hyphenCount}");
}
}
出力結果:
シリアルキー: ABC-909-XYZ-123
アルファベットの数: 6
数字の数: 6
ハイフンの数: 3
補足:forループによるインデックスアクセス
foreachの代わりに、従来のforループとインデクサ([])を使って1文字ずつアクセスすることも可能です。
string message = "C#";
// for ループ (インデックス i を使用)
for (int i = 0; i < message.Length; i++)
{
// message[i] で i 番目の文字 (char) にアクセス
char ch = message[i];
Console.WriteLine($"インデックス {i}: {ch}");
}
出力結果:
インデックス 0: C
インデックス 1: #
foreachが「すべての文字を順番に処理する」場合に適しているのに対し、forループは「特定の位置(i)の文字にアクセスしたい」場合や、「1文字おきに処理したい」といった複雑な制御が必要な場合に適しています。
まとめ
C#のstring型はchar型のコレクションであるため、foreachループを用いることで、文字列を構成する各文字に対して簡単かつ直感的に繰り返し処理を実行できます。
特定の文字のカウントや、文字列の検証など、多くの場面でこのテクニックが役立ちます。
