C#文字列の使い方完全ガイド|結合・比較・変換・検索・置換まで初心者向けに解説

はじめに

C#でプログラムを書くうえで、文字列操作はほぼ必ず使います。画面にメッセージを表示する、ユーザーの入力を受け取る、ファイル名を加工する、CSVデータを分割する、数値や日付を見やすい形式に変換するなど、C#の文字列はさまざまな場面で登場します。

C#では文字列を主にstring型で扱います。初心者のうちは、文字列の結合、比較、変換、検索、置換などで迷うことが多いですが、基本的な使い方を順番に理解すれば難しくありません。

この記事では、C#文字列の基礎から、実践でよく使うメソッド、初心者がつまずきやすい注意点まで、サンプルコード付きでわかりやすく解説します。

1. C#の文字列とは?初心者が最初に理解すべき基本

1-1. C#における文字列はstring型で扱う

C#で文字列を扱うときは、基本的にstring型を使います。文字列とは、複数の文字が並んだデータのことです。

C#
string message = "こんにちは";
Console.WriteLine(message);

この例では、"こんにちは"という文字列をmessageという変数に代入しています。

C#では、文字列はダブルクォーテーション"で囲みます。シングルクォーテーション'は1文字を表すchar型で使うため、文字列には使えません。

C#
string text = "A"; // 文字列
char ch = 'A'; // 1文字

1-2. stringとStringの違い

C#では、stringStringの両方を見かけることがあります。

C#
string name1 = "Tanaka";
String name2 = "Suzuki";

結論として、stringStringはほぼ同じ意味です。stringはC#のキーワードで、実体はSystem.Stringです。

一般的なC#コードでは、変数宣言にはstringを使うことが多いです。

C#
string name = "Yamada";

一方、静的メソッドを呼び出すときはstringまたはStringのどちらでも書けます。

C#
bool result1 = string.IsNullOrEmpty(name);
bool result2 = String.IsNullOrEmpty(name);

初心者のうちは、基本的にstringを使うと覚えておけば問題ありません。

1-3. 文字列は変更できない「イミュータブル」な型

C#の文字列は「イミュータブル」です。イミュータブルとは、一度作成した値を変更できないという意味です。

たとえば、Replaceで文字列を置換しても、元の文字列自体は変わりません。

C#
string text = "apple";
text.Replace("a", "A");

Console.WriteLine(text); // apple

置換後の文字列を使いたい場合は、戻り値を変数に代入する必要があります。

C#
string text = "apple";
text = text.Replace("a", "A");

Console.WriteLine(text); // Apple

C#文字列操作では、この「元の文字列は変わらない」という性質を理解しておくことが大切です。

1-4. 文字列リテラルの書き方

文字列リテラルとは、コードの中に直接書いた文字列のことです。

C#
string greeting = "こんにちは";

通常の文字列はダブルクォーテーションで囲みます。

C#
string text = "C#の文字列";

文字列の中でダブルクォーテーションを使いたい場合は、エスケープシーケンスを使います。

C#
string text = "彼は\"こんにちは\"と言いました。";
Console.WriteLine(text);

出力結果は次のようになります。

彼は"こんにちは"と言いました。

また、@を使うと、改行やバックスラッシュをそのまま書ける逐語的文字列リテラルになります。

C#
string path = @"C:\Users\Sample\Documents";

1-5. null・空文字・空白文字列の違い

C#の文字列では、null、空文字、空白文字列の違いを理解しておく必要があります。

C#
string a = null;      // 値が存在しない
string b = ""; // 文字数が0の文字列
string c = " "; // 空白だけの文字列

それぞれ意味が異なります。

nullは、文字列オブジェクト自体が存在しない状態です。空文字""は、文字は入っていないものの、文字列としては存在しています。空白文字列" "は、スペースなどの空白文字が含まれている文字列です。

判定には、次のメソッドがよく使われます。

C#
string text = "   ";

Console.WriteLine(string.IsNullOrEmpty(text)); // False
Console.WriteLine(string.IsNullOrWhiteSpace(text)); // True

IsNullOrEmptynullまたは空文字を判定します。IsNullOrWhiteSpaceは、空白だけの文字列もまとめて判定できます。

2. C#で文字列を宣言・代入・表示する方法

2-1. string変数を宣言する基本構文

C#で文字列変数を宣言する基本形は次のとおりです。

C#
string 変数名 = "文字列";

具体例を見てみましょう。

C#
string name = "佐藤";
string message = "こんにちは";

後から値を代入することもできます。

C#
string name;
name = "田中";

また、変数の値は再代入できます。

C#
string fruit = "りんご";
fruit = "みかん";

Console.WriteLine(fruit); // みかん

ただし、文字列自体はイミュータブルなので、再代入しているだけで元の文字列を直接変更しているわけではありません。

2-2. Console.WriteLineで文字列を出力する

文字列をコンソールに表示するには、Console.WriteLineを使います。

C#
string message = "C#の文字列を学習中です";
Console.WriteLine(message);

直接文字列を書くこともできます。

C#
Console.WriteLine("こんにちは、C#");

Console.WriteLineは出力後に改行します。改行したくない場合は、Console.Writeを使います。

C#
Console.Write("こんにちは");
Console.Write("C#");

出力結果は次のようになります。

こんにちはC#

2-3. 文字列に変数を埋め込む方法

C#で文字列に変数を埋め込む方法はいくつかあります。もっとも読みやすいのは、文字列補間です。

C#
string name = "佐藤";
int age = 25;

Console.WriteLine($"名前は{name}です。年齢は{age}歳です。");

出力結果は次のとおりです。

名前は佐藤です。年齢は25歳です。

$"..."の中で{変数名}を書くと、変数の値を文字列に埋め込めます。

従来の方法として、+演算子で結合することもできます。

C#
Console.WriteLine("名前は" + name + "です。年齢は" + age + "歳です。");

ただし、変数が多い場合は読みにくくなるため、文字列補間を使うのがおすすめです。

2-4. エスケープシーケンスの使い方

文字列の中で特殊な文字を表すには、エスケープシーケンスを使います。

代表的なエスケープシーケンスは次のとおりです。

書き方意味
\n改行
\tタブ
\"ダブルクォーテーション
\\バックスラッシュ

サンプルコードです。

C#
Console.WriteLine("1行目\n2行目");
Console.WriteLine("名前\t年齢");
Console.WriteLine("彼は\"OK\"と言いました");
Console.WriteLine("C:\\Users\\Sample");

出力結果は次のようになります。

1行目
2行目
名前 年齢
彼は"OK"と言いました
C:\Users\Sample

2-5. @を使った逐語的文字列リテラル

@を文字列の前につけると、逐語的文字列リテラルになります。

C#
string path = @"C:\Users\Sample\Documents";
Console.WriteLine(path);

通常の文字列ではバックスラッシュを\\と書く必要がありますが、@を使うとそのまま書けます。

C#
string normal = "C:\\Users\\Sample\\Documents";
string verbatim = @"C:\Users\Sample\Documents";

複数行の文字列も書けます。

C#
string text = @"1行目
2行目
3行目";

Console.WriteLine(text);

ただし、逐語的文字列リテラル内でダブルクォーテーションを表したい場合は、""と2つ続けて書きます。

C#
string text = @"彼は""こんにちは""と言いました。";
Console.WriteLine(text);

3. C#で文字列を結合する方法

3-1. +演算子で文字列を結合する

C#で文字列を結合するもっとも基本的な方法は、+演算子を使う方法です。

C#
string firstName = "太郎";
string lastName = "山田";

string fullName = lastName + firstName;

Console.WriteLine(fullName); // 山田太郎

間にスペースを入れたい場合は、スペースも文字列として結合します。

C#
string fullName = lastName + " " + firstName;
Console.WriteLine(fullName); // 山田 太郎

数値と文字列を結合すると、数値は自動的に文字列に変換されます。

C#
int age = 20;
string message = "年齢は" + age + "歳です。";

Console.WriteLine(message);

3-2. +=で文字列を追加する

既存の文字列に文字列を追加したい場合は、+=を使えます。

C#
string text = "C#";
text += "の";
text += "文字列";

Console.WriteLine(text); // C#の文字列

+=は簡単で便利ですが、ループ内で大量に使うと効率が悪くなる場合があります。大量の文字列を連結する場合は、後述するStringBuilderを使うのがおすすめです。

3-3. string.Concatで結合する

string.Concatを使って文字列を結合することもできます。

C#
string result = string.Concat("C#", "文字列", "操作");
Console.WriteLine(result); // C#文字列操作

配列の要素をまとめて結合することもできます。

C#
string[] words = { "C#", "文字列", "入門" };
string result = string.Concat(words);

Console.WriteLine(result); // C#文字列入門

区切り文字を入れずに単純につなげたい場合に使いやすいメソッドです。

3-4. string.Joinで区切り文字付きの文字列を作る

配列やリストの要素を区切り文字付きで結合したい場合は、string.Joinを使います。

C#
string[] fruits = { "りんご", "みかん", "バナナ" };

string result = string.Join(",", fruits);

Console.WriteLine(result); // りんご,みかん,バナナ

区切り文字をスペースにすることもできます。

C#
string result = string.Join(" ", fruits);
Console.WriteLine(result); // りんご みかん バナナ

CSV風の文字列を作るときにもよく使います。

C#
int[] numbers = { 10, 20, 30 };
string csv = string.Join(",", numbers);

Console.WriteLine(csv); // 10,20,30

3-5. 文字列補間で読みやすく結合する

文字列補間は、C#で文字列を作るときに非常によく使われる書き方です。

C#
string name = "佐藤";
int score = 85;

string message = $"{name}さんの点数は{score}点です。";

Console.WriteLine(message);

+演算子で書くよりも読みやすくなります。

C#
string message = name + "さんの点数は" + score + "点です。";

特に、複数の変数を含むメッセージでは、文字列補間を使うとコードが自然になります。

C#
string product = "ノート";
int price = 120;
int count = 3;

Console.WriteLine($"{product}を{count}冊買うと、合計{price * count}円です。");

3-6. 大量の文字列結合にはStringBuilderを使う

ループで大量の文字列を結合する場合は、StringBuilderを使うと効率的です。

C#
using System.Text;

StringBuilder sb = new StringBuilder();

for (int i = 1; i <= 5; i++)
{
sb.Append(i);
sb.Append("行目");
sb.AppendLine();
}

string result = sb.ToString();
Console.WriteLine(result);

StringBuilderは、文字列を何度も追加・変更する処理に向いています。

C#
sb.Append("文字列を追加");
sb.AppendLine("改行付きで追加");
sb.Insert(0, "先頭に追加");
sb.Replace("追加", "挿入");

少量の文字列結合なら+や文字列補間で十分ですが、大量の結合やループ処理ではStringBuilderを検討しましょう。

4. C#で文字列を比較する方法

4-1. ==演算子で文字列を比較する

C#では、文字列の内容が同じかどうかを==演算子で比較できます。

C#
string a = "apple";
string b = "apple";

Console.WriteLine(a == b); // True

内容が異なる場合はFalseになります。

C#
string a = "apple";
string b = "orange";

Console.WriteLine(a == b); // False

C#のstringでは、==は文字列の内容を比較します。初心者にとってもっともわかりやすい比較方法です。

4-2. Equalsメソッドで比較する

Equalsメソッドでも文字列を比較できます。

C#
string a = "C#";
string b = "C#";

Console.WriteLine(a.Equals(b)); // True

Equalsは比較条件を指定できるため、大文字・小文字を無視した比較などにも使えます。

C#
string a = "apple";
string b = "APPLE";

bool result = a.Equals(b, StringComparison.OrdinalIgnoreCase);

Console.WriteLine(result); // True

ただし、変数がnullの可能性がある場合は注意が必要です。

C#
string a = null;
string b = "test";

// a.Equals(b) は NullReferenceException になる

このような場合は、string.Equalsを使うと安全です。

C#
bool result = string.Equals(a, b);
Console.WriteLine(result); // False

4-3. Compareメソッドで大小を比較する

文字列の大小関係を比較したい場合は、string.Compareを使います。

C#
int result = string.Compare("apple", "banana");

Console.WriteLine(result);

戻り値の意味は次のとおりです。

戻り値意味
0より小さい1つ目の文字列が小さい
02つの文字列が等しい
0より大きい1つ目の文字列が大きい

例を見てみましょう。

C#
Console.WriteLine(string.Compare("apple", "banana")); // 0より小さい
Console.WriteLine(string.Compare("apple", "apple")); // 0
Console.WriteLine(string.Compare("banana", "apple")); // 0より大きい

並び替えや辞書順の判定で使われることがあります。

4-4. 大文字・小文字を区別せずに比較する

大文字・小文字を無視して比較したい場合は、StringComparison.OrdinalIgnoreCaseを指定します。

C#
string a = "Hello";
string b = "hello";

bool result = string.Equals(a, b, StringComparison.OrdinalIgnoreCase);

Console.WriteLine(result); // True

Equalsメソッドでも使えます。

C#
bool result = a.Equals(b, StringComparison.OrdinalIgnoreCase);

検索や判定で大文字・小文字を区別したくない場合は、ToLowerToUpperで変換して比較する方法もあります。

C#
bool result = a.ToLower() == b.ToLower();

ただし、比較目的であればStringComparison.OrdinalIgnoreCaseを使うほうが意図が明確です。

4-5. nullを含む文字列比較で注意すべきこと

文字列比較では、nullに注意が必要です。

C#
string text = null;

Console.WriteLine(text == "abc"); // False

==で比較するだけなら例外にはなりません。

しかし、nullの変数からメソッドを呼ぶと例外になります。

C#
string text = null;

// NullReferenceException
Console.WriteLine(text.Equals("abc"));

安全に比較したい場合は、string.Equalsを使います。

C#
string text = null;

bool result = string.Equals(text, "abc");

Console.WriteLine(result); // False

大文字・小文字を無視する場合も同様です。

C#
bool result = string.Equals(text, "ABC", StringComparison.OrdinalIgnoreCase);

5. C#で文字列を変換する方法

5-1. 数値を文字列に変換する

数値を文字列に変換するには、ToStringを使います。

C#
int number = 123;
string text = number.ToString();

Console.WriteLine(text); // 123

文字列結合や文字列補間では、自動的に文字列へ変換されます。

C#
int age = 20;

string message1 = "年齢は" + age + "歳です。";
string message2 = $"年齢は{age}歳です。";

小数も同じように変換できます。

C#
double price = 123.45;
string text = price.ToString();

Console.WriteLine(text);

5-2. 文字列をintやdoubleに変換する

文字列を数値に変換するには、ParseまたはTryParseを使います。

C#
string text = "123";
int number = int.Parse(text);

Console.WriteLine(number + 10); // 133

小数に変換する場合は、double.Parseを使います。

C#
string text = "123.45";
double number = double.Parse(text);

Console.WriteLine(number);

ただし、数値に変換できない文字列をParseすると例外が発生します。

C#
string text = "abc";

// FormatException
int number = int.Parse(text);

ユーザー入力など、変換できるか不明な文字列にはTryParseを使うのが安全です。

5-3. ParseとTryParseの違い

Parseは、変換できない場合に例外を発生させます。

C#
string text = "100";
int number = int.Parse(text);

Console.WriteLine(number);

一方、TryParseは変換に成功したかどうかをboolで返します。

C#
string text = "100";

bool success = int.TryParse(text, out int number);

if (success)
{
Console.WriteLine($"変換成功: {number}");
}
else
{
Console.WriteLine("変換できませんでした");
}

変換に失敗しても例外が発生しないため、実務ではTryParseがよく使われます。

C#
string input = "abc";

if (int.TryParse(input, out int value))
{
Console.WriteLine(value);
}
else
{
Console.WriteLine("数値を入力してください");
}

5-4. ToStringで日付や数値の表示形式を整える

ToStringでは、表示形式を指定できます。

数値を3桁区切りにする例です。

C#
int price = 1234567;

Console.WriteLine(price.ToString("N0")); // 1,234,567

小数点以下の桁数を指定する例です。

C#
double rate = 0.1234;

Console.WriteLine(rate.ToString("P1")); // 12.3%

日付の形式も指定できます。

C#
DateTime today = new DateTime(2026, 6, 6);

Console.WriteLine(today.ToString("yyyy/MM/dd")); // 2026/06/06
Console.WriteLine(today.ToString("yyyy年M月d日")); // 2026年6月6日

文字列として表示する形式を整えたいときに便利です。

5-5. 大文字・小文字に変換する

英字を大文字に変換するにはToUpperを使います。

C#
string text = "hello";

Console.WriteLine(text.ToUpper()); // HELLO

小文字に変換するにはToLowerを使います。

C#
string text = "HELLO";

Console.WriteLine(text.ToLower()); // hello

大文字・小文字をそろえて比較したい場合にも使えます。

C#
string a = "Apple";
string b = "apple";

bool result = a.ToLower() == b.ToLower();

Console.WriteLine(result); // True

ただし、比較目的ならStringComparison.OrdinalIgnoreCaseを使うほうがわかりやすいです。

5-6. char配列と文字列を相互に変換する

文字列をchar配列に変換するには、ToCharArrayを使います。

C#
string text = "CSharp";
char[] chars = text.ToCharArray();

foreach (char c in chars)
{
Console.WriteLine(c);
}

char配列から文字列を作るには、new stringを使います。

C#
char[] chars = { 'C', '#', '入', '門' };

string text = new string(chars);

Console.WriteLine(text); // C#入門

文字列を1文字ずつ処理したい場合に便利です。

6. C#で文字列を検索する方法

6-1. Containsで文字列が含まれるか判定する

文字列の中に特定の文字列が含まれるか調べるには、Containsを使います。

C#
string text = "C#の文字列操作を学びます";

bool result = text.Contains("文字列");

Console.WriteLine(result); // True

含まれていない場合はFalseになります。

C#
bool result = text.Contains("Java");

Console.WriteLine(result); // False

特定のキーワードがあるかどうかを判定したいときに便利です。

6-2. IndexOfで文字列の位置を取得する

文字列の位置を取得したい場合は、IndexOfを使います。

C#
string text = "C#の文字列操作";

int index = text.IndexOf("文字列");

Console.WriteLine(index);

IndexOfは、見つかった位置を0から始まる番号で返します。見つからなかった場合は-1を返します。

C#
string text = "abcdef";

Console.WriteLine(text.IndexOf("c")); // 2
Console.WriteLine(text.IndexOf("x")); // -1

IndexOfの結果を使って、文字列が含まれるかどうかを判定することもできます。

C#
if (text.IndexOf("abc") >= 0)
{
Console.WriteLine("見つかりました");
}

6-3. LastIndexOfで後ろから検索する

最後に出現する位置を取得したい場合は、LastIndexOfを使います。

C#
string text = "apple orange apple";

int index = text.LastIndexOf("apple");

Console.WriteLine(index); // 13

ファイル名から最後のドットの位置を取得する場合にも使えます。

C#
string fileName = "sample.backup.txt";

int index = fileName.LastIndexOf(".");

Console.WriteLine(index);

複数回出現する文字列のうち、最後の位置を知りたいときに便利です。

6-4. StartsWithで先頭一致を判定する

文字列が特定の文字列で始まるか判定するには、StartsWithを使います。

C#
string url = "https://example.com";

bool result = url.StartsWith("https");

Console.WriteLine(result); // True

ファイル名の接頭辞やURLの判定などでよく使います。

C#
string fileName = "report_2026.txt";

if (fileName.StartsWith("report"))
{
Console.WriteLine("レポートファイルです");
}

6-5. EndsWithで末尾一致を判定する

文字列が特定の文字列で終わるか判定するには、EndsWithを使います。

C#
string fileName = "sample.txt";

bool result = fileName.EndsWith(".txt");

Console.WriteLine(result); // True

ファイルの拡張子判定でよく使われます。

C#
string image = "photo.jpg";

if (image.EndsWith(".jpg"))
{
Console.WriteLine("JPEG画像です");
}

6-6. 大文字・小文字を無視して検索する

大文字・小文字を無視して検索するには、StringComparison.OrdinalIgnoreCaseを指定します。

C#
string text = "Hello CSharp";

bool result = text.Contains("hello", StringComparison.OrdinalIgnoreCase);

Console.WriteLine(result); // True

IndexOfでも指定できます。

C#
string text = "Hello CSharp";

int index = text.IndexOf("csharp", StringComparison.OrdinalIgnoreCase);

Console.WriteLine(index); // 6

StartsWithEndsWithでも使えます。

C#
string fileName = "SAMPLE.TXT";

bool result = fileName.EndsWith(".txt", StringComparison.OrdinalIgnoreCase);

Console.WriteLine(result); // True

ファイル拡張子やユーザー入力の判定では、大文字・小文字を無視した検索が役立ちます。

7. C#で文字列を置換・削除・切り出しする方法

7-1. Replaceで文字列を置換する

文字列の一部を置換するには、Replaceを使います。

C#
string text = "私はJavaを学んでいます";

string result = text.Replace("Java", "C#");

Console.WriteLine(result); // 私はC#を学んでいます

特定の文字を置換することもできます。

C#
string text = "2026-06-06";

string result = text.Replace("-", "/");

Console.WriteLine(result); // 2026/06/06

注意点として、Replaceは元の文字列を変更しません。置換後の文字列を使うには、戻り値を変数に代入します。

7-2. Removeで指定した文字を削除する

指定した位置から文字列を削除するには、Removeを使います。

C#
string text = "abcdef";

string result = text.Remove(2);

Console.WriteLine(result); // ab

この例では、インデックス2以降の文字列を削除しています。

削除する文字数を指定することもできます。

C#
string text = "abcdef";

string result = text.Remove(2, 3);

Console.WriteLine(result); // abf

Remove(2, 3)は、インデックス2から3文字を削除します。

7-3. Substringで一部の文字列を切り出す

文字列の一部を取り出すには、Substringを使います。

C#
string text = "abcdef";

string result = text.Substring(2);

Console.WriteLine(result); // cdef

開始位置と文字数を指定することもできます。

C#
string text = "abcdef";

string result = text.Substring(2, 3);

Console.WriteLine(result); // cde

Substring(2, 3)は、インデックス2から3文字を取り出します。

ファイル名から拡張子を取り出す例です。

C#
string fileName = "sample.txt";

int index = fileName.LastIndexOf(".");
string extension = fileName.Substring(index + 1);

Console.WriteLine(extension); // txt

7-4. Trimで前後の空白を削除する

文字列の前後にある空白を削除するには、Trimを使います。

C#
string text = "  C#  ";

string result = text.Trim();

Console.WriteLine(result); // C#

ユーザー入力を整えるときによく使います。

C#
string input = "  yamada@example.com  ";
string email = input.Trim();

Console.WriteLine(email);

Trimは前後の空白を削除しますが、文字列の途中にある空白は削除しません。

C#
string text = "  C#  入門  ";

Console.WriteLine(text.Trim()); // C# 入門

7-5. TrimStart・TrimEndで片側だけ空白を削除する

先頭の空白だけを削除したい場合は、TrimStartを使います。

C#
string text = "  C#  ";

Console.WriteLine(text.TrimStart()); // C#

末尾の空白だけを削除したい場合は、TrimEndを使います。

C#
string text = "  C#  ";

Console.WriteLine(text.TrimEnd()); // C#

特定の文字を削除することもできます。

C#
string text = "---C#---";

Console.WriteLine(text.Trim('-')); // C#
Console.WriteLine(text.TrimStart('-')); // C#---
Console.WriteLine(text.TrimEnd('-')); // ---C#

7-6. Insertで文字列を挿入する

文字列の途中に別の文字列を挿入するには、Insertを使います。

C#
string text = "C#文字列";

string result = text.Insert(2, "の");

Console.WriteLine(result); // C#の文字列

Insert(2, "の")は、インデックス2の位置に"の"を挿入します。

日付文字列を整形する例です。

C#
string date = "20260606";

date = date.Insert(4, "/");
date = date.Insert(7, "/");

Console.WriteLine(date); // 2026/06/06

8. C#で文字列を分割・結合して加工する方法

8-1. Splitで文字列を分割する

文字列を分割するには、Splitを使います。

C#
string text = "りんご,みかん,バナナ";

string[] fruits = text.Split(',');

foreach (string fruit in fruits)
{
Console.WriteLine(fruit);
}

出力結果は次のとおりです。

りんご
みかん
バナナ

カンマ区切りやスペース区切りの文字列を扱うときに便利です。

8-2. 複数の区切り文字で分割する

複数の区切り文字を指定して分割することもできます。

C#
string text = "apple,orange;banana";

char[] separators = { ',', ';' };

string[] items = text.Split(separators);

foreach (string item in items)
{
Console.WriteLine(item);
}

出力結果は次のようになります。

apple
orange
banana

スペースやタブ、カンマなどをまとめて区切り文字にしたい場合にも使えます。

C#
string text = "A B,C;D";
string[] items = text.Split(new char[] { ' ', ',', ';' });

8-3. 空の要素を除外して分割する

連続した区切り文字があると、空文字の要素が作られることがあります。

C#
string text = "apple,,orange,banana";

string[] items = text.Split(',');

foreach (string item in items)
{
Console.WriteLine($"[{item}]");
}

出力結果です。

[apple]
[]
[orange]
[banana]

空の要素を除外したい場合は、StringSplitOptions.RemoveEmptyEntriesを使います。

C#
string text = "apple,,orange,banana";

string[] items = text.Split(',', StringSplitOptions.RemoveEmptyEntries);

foreach (string item in items)
{
Console.WriteLine(item);
}

8-4. Joinで配列やリストを文字列に戻す

分割した配列を再び文字列に戻すには、string.Joinを使います。

C#
string[] items = { "apple", "orange", "banana" };

string result = string.Join(",", items);

Console.WriteLine(result); // apple,orange,banana

リストにも使えます。

C#
List<string> names = new List<string> { "佐藤", "鈴木", "田中" };

string result = string.Join("、", names);

Console.WriteLine(result); // 佐藤、鈴木、田中

SplitJoinを組み合わせると、文字列の加工がしやすくなります。

8-5. CSV風の文字列を扱う基本例

簡単なCSV風の文字列を分割する例です。

C#
string line = "1001,佐藤,東京";

string[] columns = line.Split(',');

string id = columns[0];
string name = columns[1];
string area = columns[2];

Console.WriteLine($"ID: {id}");
Console.WriteLine($"名前: {name}");
Console.WriteLine($"地域: {area}");

出力結果です。

ID: 1001
名前: 佐藤
地域: 東京

ただし、実際のCSVでは、値の中にカンマが含まれる場合やダブルクォーテーションで囲まれる場合があります。本格的なCSV処理では、専用ライブラリやCSVパーサーを使うのが安全です。

9. C#文字列操作でよく使うプロパティ・メソッド一覧

9-1. Lengthで文字数を取得する

文字列の長さを取得するには、Lengthプロパティを使います。

C#
string text = "C#文字列";

Console.WriteLine(text.Length);

英数字だけでなく、日本語も数えられます。

C#
string text = "こんにちは";

Console.WriteLine(text.Length); // 5

ただし、絵文字や一部の結合文字では、見た目の文字数とLengthの値が一致しないことがあります。

9-2. 文字列のn文字目を取得する

文字列の特定の位置にある文字を取得するには、インデックスを使います。

C#
string text = "abcdef";

char c = text[2];

Console.WriteLine(c); // c

C#の文字列は0番目から数えます。

C#
string text = "ABC";

Console.WriteLine(text[0]); // A
Console.WriteLine(text[1]); // B
Console.WriteLine(text[2]); // C

存在しない位置を指定すると例外が発生するため注意しましょう。

9-3. IsNullOrEmptyでnullまたは空文字を判定する

文字列がnullまたは空文字かどうかを判定するには、string.IsNullOrEmptyを使います。

C#
string text = "";

if (string.IsNullOrEmpty(text))
{
Console.WriteLine("nullまたは空文字です");
}

nullでも安全に判定できます。

C#
string text = null;

Console.WriteLine(string.IsNullOrEmpty(text)); // True

ユーザー入力や任意項目のチェックでよく使います。

9-4. IsNullOrWhiteSpaceで空白文字列も判定する

空白だけの文字列も空として扱いたい場合は、string.IsNullOrWhiteSpaceを使います。

C#
string text = "   ";

Console.WriteLine(string.IsNullOrWhiteSpace(text)); // True

IsNullOrEmptyとの違いは、空白文字列をどう扱うかです。

C#
string text = "   ";

Console.WriteLine(string.IsNullOrEmpty(text)); // False
Console.WriteLine(string.IsNullOrWhiteSpace(text)); // True

入力チェックでは、IsNullOrWhiteSpaceのほうが実用的な場面が多いです。

9-5. PadLeft・PadRightで桁揃えする

文字列の左側に指定した文字を追加して桁をそろえるには、PadLeftを使います。

C#
string number = "123";

Console.WriteLine(number.PadLeft(5, '0')); // 00123

右側に追加する場合は、PadRightを使います。

C#
string text = "C#";

Console.WriteLine(text.PadRight(5, '.')); // C#...

固定桁のコードや表示の整形に便利です。

C#
int id = 7;
string code = id.ToString().PadLeft(4, '0');

Console.WriteLine(code); // 0007

9-6. Formatで文字列を書式設定する

string.Formatを使うと、文字列の中に値を埋め込めます。

C#
string name = "佐藤";
int age = 30;

string message = string.Format("{0}さんは{1}歳です。", name, age);

Console.WriteLine(message);

{0}{1}には、後ろの引数が順番に入ります。

数値や日付の書式指定もできます。

C#
int price = 1200;
DateTime date = new DateTime(2026, 6, 6);

Console.WriteLine(string.Format("価格: {0:N0}円", price));
Console.WriteLine(string.Format("日付: {0:yyyy/MM/dd}", date));

現在では文字列補間のほうが読みやすいため、次のように書くことも多いです。

C#
Console.WriteLine($"価格: {price:N0}円");
Console.WriteLine($"日付: {date:yyyy/MM/dd}");

10. C#文字列操作で初心者がつまずきやすい注意点

10-1. 文字列は0番目から数える

C#の文字列では、文字の位置は0番目から数えます。

C#
string text = "ABC";

Console.WriteLine(text[0]); // A
Console.WriteLine(text[1]); // B
Console.WriteLine(text[2]); // C

1文字目だからといってtext[1]を指定すると、2文字目を取得してしまいます。

SubstringIndexOfでも、位置は0から始まります。

C#
string text = "abcdef";

Console.WriteLine(text.Substring(0, 3)); // abc

10-2. IndexOutOfRangeExceptionが起きる原因

存在しないインデックスを指定すると、IndexOutOfRangeExceptionが発生します。

C#
string text = "ABC";

Console.WriteLine(text[3]); // 例外

ABCのインデックスは012までです。3は存在しません。

安全に取得するには、Lengthを確認します。

C#
string text = "ABC";
int index = 2;

if (index >= 0 && index < text.Length)
{
Console.WriteLine(text[index]);
}
else
{
Console.WriteLine("範囲外です");
}

10-3. NullReferenceExceptionを防ぐ書き方

nullの文字列からメソッドを呼ぶと、NullReferenceExceptionが発生します。

C#
string text = null;

// 例外
Console.WriteLine(text.Length);

事前にnullチェックをしましょう。

C#
string text = null;

if (text != null)
{
Console.WriteLine(text.Length);
}

または、string.IsNullOrEmptystring.IsNullOrWhiteSpaceを使います。

C#
if (!string.IsNullOrEmpty(text))
{
Console.WriteLine(text.Length);
}

null条件演算子を使う方法もあります。

C#
int? length = text?.Length;

Console.WriteLine(length);

10-4. Replaceしても元の文字列は変わらない

C#の文字列はイミュータブルなので、Replaceを呼んでも元の文字列は変わりません。

C#
string text = "apple";

text.Replace("a", "A");

Console.WriteLine(text); // apple

置換後の文字列を使うには、戻り値を代入します。

C#
string text = "apple";

text = text.Replace("a", "A");

Console.WriteLine(text); // Apple

TrimSubstringToUpperなども同じです。新しい文字列を返すだけで、元の文字列は変更されません。

10-5. 全角・半角や大文字・小文字の違いに注意する

C#の文字列比較では、全角と半角は別の文字として扱われます。

C#
string a = "ABC";
string b = "ABC";

Console.WriteLine(a == b); // False

大文字と小文字も通常は別の文字として扱われます。

C#
string a = "apple";
string b = "APPLE";

Console.WriteLine(a == b); // False

大文字・小文字を無視したい場合は、StringComparison.OrdinalIgnoreCaseを指定します。

C#
bool result = string.Equals(a, b, StringComparison.OrdinalIgnoreCase);

全角・半角をそろえたい場合は、入力時のルールや正規化処理を検討する必要があります。

10-6. 日本語や絵文字の文字数カウントに注意する

Lengthは文字列の長さを取得できますが、見た目の文字数と常に一致するとは限りません。

C#
string text = "こんにちは";

Console.WriteLine(text.Length); // 5

日本語の一般的な文字では問題ないことが多いですが、絵文字や結合文字では注意が必要です。

C#
string emoji = "😊";

Console.WriteLine(emoji.Length);

絵文字は内部的に複数のcharとして扱われることがあります。そのため、「画面上では1文字に見えるのに、Lengthでは2以上になる」ケースがあります。

ユーザーに見える文字数を正確に数える必要がある場合は、単純なLengthだけで判断しないようにしましょう。

11. C#文字列操作の実践サンプル

11-1. 入力された名前を整形して表示する

ユーザーが入力した名前の前後の空白を削除して表示する例です。

C#
Console.Write("名前を入力してください: ");
string input = Console.ReadLine();

string name = input.Trim();

Console.WriteLine($"{name}さん、こんにちは!");

Trimを使うことで、余計な空白を取り除けます。

入力:   佐藤  
出力: 佐藤さん、こんにちは!

実際の入力処理では、空文字や空白だけの入力もチェックすると安全です。

C#
Console.Write("名前を入力してください: ");
string input = Console.ReadLine();

if (string.IsNullOrWhiteSpace(input))
{
Console.WriteLine("名前が入力されていません");
}
else
{
string name = input.Trim();
Console.WriteLine($"{name}さん、こんにちは!");
}

11-2. メールアドレスに@が含まれるか確認する

メールアドレスに@が含まれるか確認する簡単な例です。

C#
string email = "sample@example.com";

if (email.Contains("@"))
{
Console.WriteLine("メールアドレスの形式に見えます");
}
else
{
Console.WriteLine("@が含まれていません");
}

前後の空白を削除してから判定すると、より実用的です。

C#
string input = "  sample@example.com  ";
string email = input.Trim();

if (!string.IsNullOrEmpty(email) && email.Contains("@"))
{
Console.WriteLine("OK");
}
else
{
Console.WriteLine("メールアドレスを確認してください");
}

ただし、@が含まれているだけでは正しいメールアドレスとは限りません。本格的な検証には、より厳密なチェックが必要です。

11-3. カンマ区切りの文字列を分割する

カンマ区切りの文字列を配列に分割する例です。

C#
string csv = "red,blue,green";

string[] colors = csv.Split(',');

foreach (string color in colors)
{
Console.WriteLine(color);
}

空白が含まれる場合は、Trimを組み合わせます。

C#
string csv = "red, blue, green";

string[] colors = csv.Split(',');

foreach (string color in colors)
{
Console.WriteLine(color.Trim());
}

出力結果です。

red
blue
green

11-4. ファイル名の拡張子を取り出す

ファイル名から拡張子を取り出すには、LastIndexOfSubstringを使えます。

C#
string fileName = "document.pdf";

int dotIndex = fileName.LastIndexOf(".");

if (dotIndex >= 0)
{
string extension = fileName.Substring(dotIndex + 1);
Console.WriteLine(extension); // pdf
}
else
{
Console.WriteLine("拡張子がありません");
}

最後のドットを使うことで、次のようなファイル名にも対応しやすくなります。

C#
string fileName = "backup.2026.06.txt";

この場合、最後の.txtを拡張子として取り出せます。

11-5. テンプレート文の一部を置換する

テンプレート文字列の一部を置換して、メッセージを作る例です。

C#
string template = "{name}さん、注文番号{orderId}を受け付けました。";

string message = template
.Replace("{name}", "佐藤")
.Replace("{orderId}", "A001");

Console.WriteLine(message);

出力結果です。

佐藤さん、注文番号A001を受け付けました。

テンプレートの一部を差し替える処理では、Replaceが便利です。

ただし、複雑なテンプレート処理では、専用のテンプレートエンジンや文字列補間を使うほうが管理しやすい場合もあります。

11-6. 数値や日付を見やすい文字列に変換する

数値や日付は、表示形式を指定して文字列に変換できます。

C#
int price = 1234567;
DateTime orderDate = new DateTime(2026, 6, 6);

string message = $"注文日: {orderDate:yyyy/MM/dd}, 金額: {price:N0}円";

Console.WriteLine(message);

出力結果です。

注文日: 2026/06/06, 金額: 1,234,567円

数値や日付を画面に表示する場合は、読みやすい形式に整えることが重要です。

C#
double rate = 0.0875;

Console.WriteLine($"達成率: {rate:P1}"); // 達成率: 8.8%

12. C#文字列に関するよくある質問

12-1. C#で文字列を改行するには?

C#で文字列を改行するには、\nを使います。

C#
string text = "1行目\n2行目";

Console.WriteLine(text);

出力結果です。

1行目
2行目

環境に合わせた改行を使いたい場合は、Environment.NewLineを使います。

C#
string text = "1行目" + Environment.NewLine + "2行目";

Console.WriteLine(text);

複数行の文字列をそのまま書きたい場合は、@を使う方法もあります。

C#
string text = @"1行目
2行目
3行目";

Console.WriteLine(text);

12-2. C#で文字列が空かどうか判定するには?

文字列がnullまたは空文字かどうか判定するには、string.IsNullOrEmptyを使います。

C#
string text = "";

if (string.IsNullOrEmpty(text))
{
Console.WriteLine("空です");
}

空白だけの文字列も空として扱いたい場合は、string.IsNullOrWhiteSpaceを使います。

C#
string text = "   ";

if (string.IsNullOrWhiteSpace(text))
{
Console.WriteLine("空または空白です");
}

入力チェックでは、IsNullOrWhiteSpaceのほうが便利な場面が多いです。

12-3. C#で文字列を1文字ずつ処理するには?

文字列を1文字ずつ処理するには、foreachを使います。

C#
string text = "CSharp";

foreach (char c in text)
{
Console.WriteLine(c);
}

インデックスを使う方法もあります。

C#
string text = "CSharp";

for (int i = 0; i < text.Length; i++)
{
Console.WriteLine($"{i}: {text[i]}");
}

文字の位置も必要な場合は、for文を使うと便利です。

12-4. stringとcharの違いは?

stringは文字列を表す型で、複数の文字を扱えます。

C#
string text = "A";
string word = "ABC";

charは1文字だけを表す型です。

C#
char ch = 'A';

stringはダブルクォーテーション"で囲み、charはシングルクォーテーション'で囲みます。

C#
string s = "A";
char c = 'A';

次のように、charに複数文字を入れることはできません。

C#
// エラー
char c = 'ABC';

12-5. string.Emptyと""はどちらを使うべき?

string.Empty""は、どちらも空文字を表します。

C#
string a = "";
string b = string.Empty;

動作上はほぼ同じです。どちらを使っても大きな問題はありません。

読みやすさを重視するなら、プロジェクトやチームのルールに合わせるのがよいでしょう。

C#
if (text == "")
{
Console.WriteLine("空文字です");
}

if (text == string.Empty)
{
Console.WriteLine("空文字です");
}

ただし、空文字判定では== ""よりも、string.IsNullOrEmptystring.IsNullOrWhiteSpaceを使うほうが安全です。

C#
if (string.IsNullOrEmpty(text))
{
Console.WriteLine("nullまたは空文字です");
}

12-6. 文字列結合は+とStringBuilderのどちらがよい?

少量の文字列結合であれば、+演算子や文字列補間で問題ありません。

C#
string name = "佐藤";
string message = "こんにちは、" + name + "さん";

または、文字列補間を使うと読みやすくなります。

C#
string message = $"こんにちは、{name}さん";

一方、ループ内で大量に文字列を結合する場合は、StringBuilderが向いています。

C#
using System.Text;

StringBuilder sb = new StringBuilder();

for (int i = 0; i < 1000; i++)
{
sb.Append(i);
sb.Append(",");
}

string result = sb.ToString();

目安として、簡単な結合は文字列補間、大量の結合はStringBuilderと覚えておくとよいでしょう。

まとめ

C#の文字列は、string型を使って扱います。文字列の宣言、表示、結合、比較、変換、検索、置換、分割などは、C#プログラミングの基本です。

文字列を結合するには、+演算子、文字列補間、string.Concatstring.JoinStringBuilderなどがあります。少量の結合では文字列補間が読みやすく、大量の結合ではStringBuilderが便利です。

文字列を比較するには、==Equalsを使います。大文字・小文字を無視したい場合は、StringComparison.OrdinalIgnoreCaseを指定すると安全です。

文字列の変換では、数値や日付をToStringで文字列にしたり、文字列をint.Parseint.TryParseで数値に変換したりします。ユーザー入力のように変換できるか不明な値には、TryParseを使うのがおすすめです。

検索にはContainsIndexOfLastIndexOfStartsWithEndsWithを使います。置換や加工にはReplaceRemoveSubstringTrimSplitJoinなどがよく使われます。

また、C#の文字列はイミュータブルであり、ReplaceTrimを実行しても元の文字列は変わりません。戻り値を変数に代入することを忘れないようにしましょう。

C#文字列操作は、最初は覚えることが多く感じるかもしれません。しかし、実際によく使うメソッドは限られています。まずは、LengthContainsReplaceSubstringSplitJoinTrimIsNullOrWhiteSpaceあたりから使いこなせるようになると、C#での文字列処理が一気に書きやすくなります。