C#のTrimEndとは?末尾の空白・文字を削除する使い方と注意点を徹底解説

はじめに

C#で文字列を扱っていると、末尾に余分な空白、改行、カンマ、スラッシュなどが付いてしまうことがあります。たとえば、ユーザー入力の最後にスペースが入っていたり、CSV文字列の最後にカンマが残っていたり、ログ文字列の末尾に改行が含まれていたりするケースです。

このような「文字列の末尾だけをきれいにしたい」ときに使えるのが、C#のTrimEndメソッドです。

TrimEndは、文字列の末尾にある空白文字や指定した文字を削除するためのメソッドです。ただし、使い方を誤ると「削除したい文字列そのものが消えない」「想定外の文字まで削除される」「元の文字列が変わったと思ったのに変わっていない」といったミスにつながります。

この記事では、C#のTrimEndの基本的な使い方から、空白削除、特定文字の削除、TrimTrimStartとの違い、よくある注意点、実践的な使用例まで詳しく解説します。

1. C#のTrimEndとは?末尾の空白や文字を削除するメソッド

1-1. TrimEndの役割と基本的な意味

TrimEndは、C#のstring型で使えるメソッドで、文字列の末尾にある不要な文字を削除した新しい文字列を返します。

たとえば、次のような文字列があるとします。

C#
string text = "Hello   ";

この文字列は、見た目ではHelloに見えるかもしれませんが、実際には末尾に半角スペースが含まれています。

TrimEndを使うと、末尾の空白を削除できます。

C#
string result = text.TrimEnd();

Console.WriteLine($"[{result}]");

実行結果は次のようになります。

C#
[Hello]

このように、TrimEndは「文字列の最後に付いている不要なものを取り除く」ためのメソッドです。

1-2. TrimEndで削除できるもの

TrimEndで削除できるものは、大きく分けて次の2種類です。

1つ目は、空白文字です。

C#
string text = "C#入門   ";
string result = text.TrimEnd();

この場合、末尾の半角スペースなどの空白文字が削除されます。

2つ目は、指定した文字です。

C#
string text = "data,,,";
string result = text.TrimEnd(',');

この場合、末尾に連続しているカンマが削除されます。

C#
data

指定した文字は1つだけでなく、複数指定することもできます。

C#
string text = "sample.txt...";
string result = text.TrimEnd('.', 't', 'x');

ただし、TrimEndは「文字列」ではなく「文字」を削除するメソッドです。この点はとても重要です。

1-3. 文字列の先頭ではなく末尾だけを処理する理由

TrimEndは、名前の通り「End」、つまり末尾だけを処理します。文字列の先頭や途中にある空白や文字は削除されません。

C#
string text = "   Hello   ";
string result = text.TrimEnd();

Console.WriteLine($"[{result}]");

実行結果は次のようになります。

C#
[   Hello]

末尾の空白は削除されますが、先頭の空白は残ります。

末尾だけを処理したい場面は多くあります。たとえば、CSV文字列の最後に余分なカンマが付いた場合、削除したいのは末尾のカンマだけです。

C#
string csv = "apple,banana,orange,";
string result = csv.TrimEnd(',');

このとき、途中にあるカンマまで削除してしまうとCSVの区切りが壊れてしまいます。そのため、末尾だけを安全に処理できるTrimEndが役立ちます。

1-4. TrimEndがよく使われる場面

TrimEndは、次のような場面でよく使われます。

ユーザー入力の末尾にある空白を削除する場合です。

C#
string name = input.TrimEnd();

CSVや区切り文字付き文字列の末尾に残った区切り文字を削除する場合です。

C#
string csv = "A,B,C,";
string result = csv.TrimEnd(',');

URLやファイルパスの末尾にあるスラッシュを削除する場合です。

C#
string path = "C:\\Temp\\";
string result = path.TrimEnd('\\');

ログやテキストデータの末尾にある改行を削除する場合です。

C#
string log = "Error occurred\r\n";
string result = log.TrimEnd();

このように、TrimEndは文字列整形で非常によく使われる基本的なメソッドです。

2. TrimEndの基本的な使い方

2-1. 末尾の空白を削除する基本構文

末尾の空白を削除する基本構文は次の通りです。

C#
string result = text.TrimEnd();

TrimEnd()のように引数を指定しない場合、文字列の末尾にある空白文字が削除されます。

C#
string text = "Hello World   ";
string result = text.TrimEnd();

この場合、Hello Worldの後ろにある空白が削除されます。

ポイントは、TrimEnd()が削除するのは末尾に連続している空白だけということです。文字列の途中にある空白は削除されません。

C#
string text = "Hello   World   ";
string result = text.TrimEnd();

Console.WriteLine($"[{result}]");

実行結果は次のようになります。

C#
[Hello   World]

HelloWorldの間にある空白は残ります。

2-2. TrimEnd()を使ったサンプルコード

次のコードでは、末尾に空白がある文字列に対してTrimEnd()を使っています。

C#
using System;

class Program
{
static void Main()
{
string text = "C# TrimEnd ";

string result = text.TrimEnd();

Console.WriteLine("削除前: [" + text + "]");
Console.WriteLine("削除後: [" + result + "]");
}
}

実行結果は次のようになります。

C#
削除前: [C# TrimEnd   ]
削除後: [C# TrimEnd]

角かっこで囲むと、末尾の空白が削除されたことが分かりやすくなります。

2-3. 実行結果で確認する削除前と削除後の違い

文字列の末尾の空白は、通常の表示では見えにくいです。そのため、確認するときは次のように角かっこや引用符で囲むと分かりやすくなります。

C#
string text = "Hello   ";
string result = text.TrimEnd();

Console.WriteLine($"削除前: [{text}]");
Console.WriteLine($"削除後: [{result}]");

実行結果は次の通りです。

C#
削除前: [Hello   ]
削除後: [Hello]

また、文字数を比較するとさらに明確です。

C#
Console.WriteLine(text.Length);
Console.WriteLine(result.Length);

実行結果の例です。

C#
8
5

Helloは5文字ですが、末尾にスペースが3つあるため、削除前は8文字です。TrimEnd()によって末尾の空白が削除され、5文字になります。

2-4. TrimEndは元の文字列を変更しない点に注意

C#のstringは不変です。つまり、一度作成された文字列の内容は変更されません。

TrimEndを呼び出しても、元の文字列そのものが書き換わるわけではありません。削除後の新しい文字列が戻り値として返されます。

次のコードを見てください。

C#
string text = "Hello   ";

text.TrimEnd();

Console.WriteLine($"[{text}]");

この場合、実行結果は次のようになります。

C#
[Hello   ]

TrimEnd()を呼び出していますが、戻り値を受け取っていないため、結果が使われていません。

正しくは次のように書きます。

C#
string text = "Hello   ";

text = text.TrimEnd();

Console.WriteLine($"[{text}]");

または、別の変数に代入します。

C#
string text = "Hello   ";
string trimmed = text.TrimEnd();

TrimEndを使うときは、必ず戻り値を変数に代入することを意識しましょう。

3. TrimEndで指定した文字を削除する方法

3-1. TrimEnd(char[])で末尾の特定文字を削除する

TrimEndでは、削除したい文字を指定できます。

C#
string text = "Hello!!!";
string result = text.TrimEnd('!');

実行結果は次のようになります。

C#
Hello

末尾にある!がすべて削除されます。

古い書き方や複数文字を明示的に配列で渡す場合は、次のようにchar[]を使うこともできます。

C#
string text = "Hello!!!";
string result = text.TrimEnd(new char[] { '!' });

最近のC#では、次のように簡潔に書けます。

C#
string result = text.TrimEnd('!');

3-2. 複数の文字を指定して削除する方法

複数の文字を指定したい場合は、削除対象の文字を並べて指定します。

C#
string text = "Hello!?!?";
string result = text.TrimEnd('!', '?');

実行結果は次のようになります。

C#
Hello

末尾に!または?が連続している間、削除されます。

配列で書く場合は次のようになります。

C#
string text = "Hello!?!?";
char[] chars = { '!', '?' };

string result = text.TrimEnd(chars);

ここで重要なのは、指定した文字の順番は関係ないということです。

C#
text.TrimEnd('!', '?');
text.TrimEnd('?', '!');

どちらも、末尾にある!?を削除対象として扱います。

3-3. カンマやピリオドなど記号を削除する例

CSV風の文字列を作るとき、最後に余分なカンマが残ることがあります。

C#
string csv = "apple,banana,orange,";
string result = csv.TrimEnd(',');

Console.WriteLine(result);

実行結果は次の通りです。

C#
apple,banana,orange

末尾のカンマだけが削除され、途中のカンマは残ります。

ピリオドを削除する例も見てみましょう。

C#
string text = "Hello...";
string result = text.TrimEnd('.');

Console.WriteLine(result);

実行結果は次の通りです。

C#
Hello

末尾にピリオドが複数ある場合も、連続して削除されます。

3-4. 数字やアルファベットを末尾から削除する例

TrimEndでは、記号だけでなく数字やアルファベットも削除できます。

C#
string text = "Item123";
string result = text.TrimEnd('1', '2', '3');

Console.WriteLine(result);

実行結果は次のようになります。

C#
Item

ただし、指定した文字が末尾にある限り削除されるため、次のようなケースには注意が必要です。

C#
string text = "Item321";
string result = text.TrimEnd('1', '2', '3');

Console.WriteLine(result);

実行結果は次のようになります。

C#
Item

123という並びだけを削除しているのではありません。123のいずれかが末尾にある間、削除されます。

アルファベットを削除する例です。

C#
string text = "sampleabc";
string result = text.TrimEnd('a', 'b', 'c');

Console.WriteLine(result);

実行結果は次の通りです。

C#
sample

3-5. 指定した文字が連続する場合の動作

TrimEndは、末尾に削除対象の文字が連続している場合、それらをすべて削除します。

C#
string text = "data-----";
string result = text.TrimEnd('-');

Console.WriteLine(result);

実行結果です。

C#
data

削除は、末尾から先頭方向に進みます。そして、削除対象ではない文字に出会った時点で止まります。

C#
string text = "data---x---";
string result = text.TrimEnd('-');

Console.WriteLine(result);

実行結果は次のようになります。

C#
data---x

末尾の---は削除されますが、途中の---は削除されません。

4. TrimEndで空白を削除するときの注意点

4-1. 半角スペース・タブ・改行は削除対象になるのか

TrimEnd()を引数なしで使うと、末尾の空白文字が削除されます。

対象になる代表的な空白文字には、次のようなものがあります。

C#
' '   // 半角スペース
'\t' // タブ
'\r' // キャリッジリターン
'\n' // ラインフィード

たとえば、末尾に改行がある文字列も削除できます。

C#
string text = "Hello\r\n";
string result = text.TrimEnd();

Console.WriteLine($"[{result}]");

実行結果は次の通りです。

C#
[Hello]

タブも削除対象です。

C#
string text = "Hello\t\t";
string result = text.TrimEnd();

Console.WriteLine($"[{result}]");

実行結果です。

C#
[Hello]

つまり、TrimEnd()は単なる半角スペースだけでなく、タブや改行などもまとめて処理できます。

4-2. 全角スペースはTrimEndで削除できるのか

C#のTrimEnd()は、現在の.NET環境ではUnicodeの空白文字を対象にします。そのため、全角スペースも空白文字として扱われ、末尾にある場合は削除されます。

C#
string text = "こんにちは  ";
string result = text.TrimEnd();

Console.WriteLine($"[{result}]");

実行結果は次のようになります。

C#
[こんにちは]

ただし、明示的に全角スペースだけを削除したい場合は、次のように指定できます。

C#
string text = "こんにちは  ";
string result = text.TrimEnd(' ');

この場合、削除対象は全角スペースに限定されます。

半角スペースと全角スペースの両方を削除したい場合は、次のように書けます。

C#
string text = "こんにちは  ";
string result = text.TrimEnd(' ', ' ');

4-3. Unicodeの空白文字とTrimEndの関係

TrimEnd()は、Unicode上で空白として扱われる文字を削除対象にします。たとえば、通常の半角スペースだけでなく、改行、タブ、全角スペースなども空白文字として扱われます。

ただし、見た目が空白のように見えても、環境や文字の種類によっては期待通りに削除されないと感じることがあります。

そのような場合は、対象の文字コードを確認すると原因を特定しやすくなります。

C#
string text = "Hello\u200B";

foreach (char c in text)
{
Console.WriteLine($"{c} : U+{(int)c:X4}");
}

\u200Bはゼロ幅スペースです。見た目では空白のように感じられることがありますが、通常の空白とは異なるため、TrimEnd()で削除されない場合があります。

削除したい文字が明確な場合は、次のように文字を指定します。

C#
string text = "Hello\u200B";
string result = text.TrimEnd('\u200B');

4-4. 見た目では分かりにくい空白文字に注意する

文字列の末尾にある空白は、画面上では分かりにくいことがあります。特に、次のような文字は注意が必要です。

C#
' '       // 半角スペース
' ' // 全角スペース
'\t' // タブ
'\r' // CR
'\n' // LF
'\u200B' // ゼロ幅スペース

確認するときは、文字列を角かっこで囲むだけでなく、文字数や文字コードも見るとよいです。

C#
string text = "Hello ";

Console.WriteLine($"[{text}]");
Console.WriteLine(text.Length);

さらに詳しく確認する場合は、次のように1文字ずつUnicodeコードポイントを表示します。

C#
foreach (char c in text)
{
Console.WriteLine($"U+{(int)c:X4}");
}

見た目では同じ空白に見えても、実際には異なる文字である場合があります。文字列整形で想定通りに削除されないときは、まず文字の正体を確認しましょう。

5. TrimEndとTrim・TrimStartの違い

5-1. TrimEndとTrimの違い

TrimEndTrimの違いは、削除する範囲です。

TrimEndは末尾だけを削除します。

C#
string text = "   Hello   ";
string result = text.TrimEnd();

Console.WriteLine($"[{result}]");

実行結果です。

C#
[   Hello]

一方、Trimは先頭と末尾の両方を削除します。

C#
string text = "   Hello   ";
string result = text.Trim();

Console.WriteLine($"[{result}]");

実行結果です。

C#
[Hello]

先頭の空白を残したい場合はTrimEnd、両端の空白を削除したい場合はTrimを使います。

5-2. TrimEndとTrimStartの違い

TrimStartは、文字列の先頭にある空白や指定文字を削除します。

C#
string text = "   Hello   ";
string result = text.TrimStart();

Console.WriteLine($"[{result}]");

実行結果です。

C#
[Hello   ]

TrimEndは末尾を処理します。

C#
string text = "   Hello   ";
string result = text.TrimEnd();

Console.WriteLine($"[{result}]");

実行結果です。

C#
[   Hello]

つまり、違いは次の通りです。

C#
TrimStart  // 先頭を削除
TrimEnd // 末尾を削除
Trim // 先頭と末尾を削除

5-3. 先頭・末尾・両端を削除したい場合の使い分け

目的に応じて、次のように使い分けます。

先頭の空白だけを削除したい場合です。

C#
string result = text.TrimStart();

末尾の空白だけを削除したい場合です。

C#
string result = text.TrimEnd();

先頭と末尾の空白を両方削除したい場合です。

C#
string result = text.Trim();

指定した文字を削除したい場合も同じ考え方です。

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

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

実行結果です。

C#
Hello---
---Hello
Hello

5-4. 目的別の使い分け早見表

TrimEndTrimStartTrimの使い分けは、次のように考えると分かりやすいです。

やりたいこと使うメソッド
末尾の空白を削除したいTrimEnd()"abc ""abc"
先頭の空白を削除したいTrimStart()" abc""abc"
両端の空白を削除したいTrim()" abc ""abc"
末尾のカンマを削除したいTrimEnd(',')"a,b,c,""a,b,c"
先頭のハイフンを削除したいTrimStart('-')"---abc""abc"
両端の記号を削除したいTrim('-', '.')"---abc...""abc"

文字列の途中にある文字は、どのTrim系メソッドでも削除されません。途中の文字を削除したい場合は、Replaceや正規表現など別の方法を使います。

6. TrimEndを使うときによくあるミス

6-1. 戻り値を変数に代入し忘れる

最もよくあるミスは、TrimEndの戻り値を使わないことです。

C#
string text = "Hello   ";

text.TrimEnd();

Console.WriteLine($"[{text}]");

このコードでは、末尾の空白は削除されません。TrimEnd()は新しい文字列を返すだけで、元のtextは変更されないためです。

正しくは次のように書きます。

C#
string text = "Hello   ";

text = text.TrimEnd();

Console.WriteLine($"[{text}]");

または、別の変数に入れます。

C#
string trimmed = text.TrimEnd();

C#の文字列操作では、戻り値を受け取ることが基本です。

6-2. 文字列の途中にある空白は削除されない

TrimEndは末尾だけを処理するメソッドです。文字列の途中にある空白は削除されません。

C#
string text = "Hello   World   ";
string result = text.TrimEnd();

Console.WriteLine($"[{result}]");

実行結果です。

C#
[Hello   World]

HelloWorldの間にある空白はそのままです。

文字列の途中にある空白を削除したい場合は、Replaceを使います。

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

Console.WriteLine(result);

実行結果です。

C#
HelloWorld

ただし、Replace(" ", "")は半角スペースをすべて削除するため、単語の区切りも消えます。目的に応じて慎重に使いましょう。

6-3. 指定した文字列そのものを削除できると誤解する

TrimEndで特に注意したいのが、指定できるのは「文字」であり「文字列」ではないという点です。

たとえば、末尾の.txtを削除したいとします。

C#
string fileName = "sample.txt";
string result = fileName.TrimEnd('.', 't', 'x');

一見、.txtを削除できそうに見えます。しかし、これは.txtという文字列を削除しているのではありません。.txのいずれかが末尾にある間、削除しているだけです。

たとえば次のような文字列では、想定外の結果になる可能性があります。

C#
string text = "text";
string result = text.TrimEnd('t', 'x');

Console.WriteLine(result);

実行結果は次のようになります。

C#
te

末尾のtが削除されます。これは「txtという文字列を削除」しているのではなく、「tまたはxを末尾から削除」しているためです。

特定の文字列を末尾から削除したい場合は、EndsWithなどを使いましょう。

6-4. nullの文字列に対して使うと例外になる

TrimEndはインスタンスメソッドです。そのため、nullの文字列に対して呼び出すと例外になります。

C#
string text = null;

string result = text.TrimEnd();

このコードはNullReferenceExceptionになります。

安全に処理するには、nullチェックを行います。

C#
string text = null;

string result = text == null ? null : text.TrimEnd();

または、null条件演算子を使います。

C#
string result = text?.TrimEnd();

nullの場合に空文字として扱いたいなら、次のように書けます。

C#
string result = (text ?? "").TrimEnd();

用途に応じて、nullのまま扱うのか、空文字として扱うのかを決めましょう。

6-5. 削除したくない文字まで消えてしまうケース

TrimEndに複数の文字を指定すると、それらは「文字の集合」として扱われます。

C#
string text = "report.txt";
string result = text.TrimEnd('.', 't', 'x');

Console.WriteLine(result);

実行結果は次のようになります。

C#
report

この例では期待通りに見えますが、次のような場合は注意が必要です。

C#
string text = "reporttext";
string result = text.TrimEnd('t', 'x', 'e');

Console.WriteLine(result);

実行結果は次のようになる可能性があります。

C#
report

末尾にtxeのいずれかが続く限り削除されるため、削除したい範囲を超えて消えることがあります。

「末尾が特定の文字列なら、その文字列だけ削除したい」という場合は、TrimEndではなくEndsWithSubstringなどを使うほうが安全です。

7. TrimEndで末尾の文字列を削除したい場合の対応方法

7-1. TrimEndは文字単位で削除するメソッド

TrimEndは、末尾から指定された文字を削除するメソッドです。文字列そのものを削除するメソッドではありません。

C#
string text = "sample.txt";
string result = text.TrimEnd('.', 't', 'x');

このコードは、.txtというまとまりを削除しているのではなく、.txのいずれかを末尾から削除しています。

そのため、末尾の拡張子や特定の接尾辞を削除したい場合は、別の方法を使うべきです。

7-2. 特定の文字列を末尾から削除したい場合の考え方

特定の文字列を末尾から削除したい場合は、次の流れで考えます。

まず、文字列が指定した接尾辞で終わっているかを確認します。

C#
text.EndsWith(".txt")

終わっている場合だけ、その分の長さを削除します。

C#
text.Substring(0, text.Length - ".txt".Length)

このようにすると、削除したい文字列そのものだけを安全に削除できます。

7-3. EndsWithとSubstringを組み合わせる方法

末尾の.txtを削除する例です。

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

if (fileName.EndsWith(suffix, StringComparison.Ordinal))
{
fileName = fileName.Substring(0, fileName.Length - suffix.Length);
}

Console.WriteLine(fileName);

実行結果です。

C#
sample

StringComparison.Ordinalを指定すると、文字列を単純なバイナリ比較として扱えるため、ファイル拡張子や識別子の比較に向いています。

メソッド化すると、次のように使いやすくなります。

C#
static string RemoveSuffix(string text, string suffix)
{
if (text == null)
{
return null;
}

if (suffix == null)
{
return text;
}

return text.EndsWith(suffix, StringComparison.Ordinal)
? text.Substring(0, text.Length - suffix.Length)
: text;
}

使用例です。

C#
string result = RemoveSuffix("sample.txt", ".txt");
Console.WriteLine(result);

実行結果です。

C#
sample

7-4. Replaceとの違いと使い分け

Replaceは、文字列内にある指定文字列をすべて置換します。

C#
string text = "sample.txt.backup.txt";
string result = text.Replace(".txt", "");

Console.WriteLine(result);

実行結果です。

C#
sample.backup

このように、末尾だけでなく途中の.txtも削除されます。

一方、末尾の.txtだけを削除したい場合は、EndsWithSubstringを使います。

C#
string text = "sample.txt.backup.txt";
string suffix = ".txt";

if (text.EndsWith(suffix, StringComparison.Ordinal))
{
text = text.Substring(0, text.Length - suffix.Length);
}

Console.WriteLine(text);

実行結果です。

C#
sample.txt.backup

使い分けは次の通りです。

目的方法
文字列内のすべてを置換・削除したいReplace
末尾にある場合だけ削除したいEndsWith + Substring
末尾の特定文字を連続削除したいTrimEnd

7-5. .NETのRemoveやRangeを使った削除例

Substringの代わりにRemoveを使うこともできます。

C#
string text = "sample.txt";
string suffix = ".txt";

if (text.EndsWith(suffix, StringComparison.Ordinal))
{
text = text.Remove(text.Length - suffix.Length);
}

Console.WriteLine(text);

実行結果です。

C#
sample

C# 8.0以降では、Range構文を使って次のように書くこともできます。

C#
string text = "sample.txt";
string suffix = ".txt";

if (text.EndsWith(suffix, StringComparison.Ordinal))
{
text = text[..^suffix.Length];
}

Console.WriteLine(text);

実行結果です。

C#
sample

ただし、Range構文は慣れていない人には少し分かりにくい場合があります。チーム開発では、可読性を考えてSubstringRemoveを選ぶのもよい方法です。

8. TrimEndの実践的な使用例

8-1. CSVデータの末尾カンマを削除する

CSV文字列をループで組み立てると、最後に余分なカンマが付くことがあります。

C#
string csv = "apple,banana,orange,";
string result = csv.TrimEnd(',');

Console.WriteLine(result);

実行結果です。

C#
apple,banana,orange

ただし、本格的なCSV生成では、値にカンマやダブルクォートが含まれる場合があります。そのため、実務ではstring.Joinを使うほうが安全です。

C#
string[] fruits = { "apple", "banana", "orange" };
string csv = string.Join(",", fruits);

Console.WriteLine(csv);

実行結果です。

C#
apple,banana,orange

TrimEnd(',')は簡単な整形には便利ですが、最初から余分なカンマを作らない書き方も検討しましょう。

8-2. ユーザー入力の末尾空白を削除する

ユーザー入力では、末尾に不要な空白が入ることがあります。

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

name = name?.TrimEnd();

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

?.を使っているため、Console.ReadLine()nullを返した場合でも例外を防げます。

ただし、入力値の前後の空白をすべて削除したい場合は、Trim()を使うほうが自然です。

C#
name = name?.Trim();

一方、先頭の空白には意味があり、末尾だけ削除したい場合はTrimEnd()が適しています。

8-3. ファイルパス末尾の区切り文字を削除する

ファイルパスの末尾にある区切り文字を削除したい場合にもTrimEndが使えます。

C#
string path = @"C:\Temp\";
string result = path.TrimEnd('\\');

Console.WriteLine(result);

実行結果です。

C#
C:\Temp

URLの場合はスラッシュを削除できます。

C#
string url = "https://example.com/";
string result = url.TrimEnd('/');

Console.WriteLine(result);

実行結果です。

C#
https://example.com

WindowsパスとURLの両方を考慮する場合は、次のように複数指定できます。

C#
string path = "C:/Temp/";
string result = path.TrimEnd('/', '\\');

ただし、ルートパスを扱う場合は注意が必要です。

C#
string path = "/";
string result = path.TrimEnd('/');

この場合、結果は空文字になります。パス処理では、単純にTrimEndを使うだけでなく、ルートやドライブ名などの扱いも考慮しましょう。

8-4. ログ文字列の末尾改行を削除する

ログやテキストファイルの末尾には、改行が含まれていることがあります。

C#
string log = "処理が完了しました。\r\n";
string result = log.TrimEnd();

Console.WriteLine($"[{result}]");

実行結果です。

C#
[処理が完了しました。]

改行だけを明示的に削除したい場合は、次のように指定します。

C#
string result = log.TrimEnd('\r', '\n');

この書き方であれば、末尾の半角スペースやタブは削除せず、改行コードだけを削除できます。

C#
string log = "処理が完了しました。   \r\n";
string result = log.TrimEnd('\r', '\n');

Console.WriteLine($"[{result}]");

実行結果です。

C#
[処理が完了しました。   ]

空白も含めて末尾を整理したいならTrimEnd()、改行だけ削除したいならTrimEnd('\r', '\n')のように使い分けます。

8-5. APIやDB保存前の文字列整形に使う

APIに送信するデータやDBに保存するデータでは、末尾の不要な空白を削除したいことがあります。

C#
public class User
{
public string Name { get; set; }
public string Email { get; set; }
}

保存前に整形する例です。

C#
user.Name = user.Name?.TrimEnd();
user.Email = user.Email?.TrimEnd();

ただし、メールアドレスやユーザー名では、通常は先頭と末尾の両方の空白を削除することが多いです。

C#
user.Email = user.Email?.Trim();

一方で、文章入力欄のように先頭の空白に意味がある場合は、末尾だけ削除するTrimEnd()が適していることがあります。

C#
article.Body = article.Body?.TrimEnd();

このように、TrimEndはデータを保存する前の軽い整形処理に役立ちます。

9. TrimEndのパフォーマンスと安全な使い方

9-1. 文字列操作で新しい文字列が作られる仕組み

C#のstringは不変です。そのため、TrimEndを実行すると、必要に応じて新しい文字列が作られます。

C#
string text = "Hello   ";
string result = text.TrimEnd();

このとき、textの中身が直接変わるわけではありません。末尾の空白を削除した結果がresultに入ります。

文字列を何度も加工する場合、毎回新しい文字列が作られる可能性があります。通常の処理では大きな問題になりませんが、大量データを扱う場合は意識しておくとよいでしょう。

9-2. 大量データ処理で意識したいポイント

大量の文字列に対してTrimEndを使う場合は、無駄な処理を減らすことが大切です。

たとえば、リスト内の文字列を整形する例です。

C#
List<string> lines = new List<string>
{
"apple ",
"banana ",
"orange "
};

for (int i = 0; i < lines.Count; i++)
{
lines[i] = lines[i]?.TrimEnd();
}

このように、必要な箇所でだけTrimEndを使えば問題ありません。

ただし、ループの中で複雑な文字列連結を繰り返している場合は、StringBuilderstring.Joinを検討したほうがよいことがあります。

よくない例です。

C#
string csv = "";

foreach (var item in items)
{
csv += item + ",";
}

csv = csv.TrimEnd(',');

改善例です。

C#
string csv = string.Join(",", items);

TrimEndで最後のカンマを消すより、最初から余分なカンマを作らないほうが読みやすく、効率的です。

9-3. nullや空文字を安全に処理する方法

TrimEndを安全に使うには、nullへの対策が重要です。

nullの可能性がある場合は、null条件演算子を使います。

C#
string result = text?.TrimEnd();

nullを空文字として扱いたい場合は、次のようにします。

C#
string result = (text ?? "").TrimEnd();

空文字に対してTrimEndを使うこと自体は問題ありません。

C#
string text = "";
string result = text.TrimEnd();

Console.WriteLine(result);

結果は空文字のままです。

nullと空文字は別物なので、どちらとして扱いたいのかを明確にしてコードを書くことが大切です。

9-4. 可読性を高める書き方のコツ

TrimEndを使うときは、何を削除しているのかが分かるように書くと可読性が高まります。

たとえば、末尾のスラッシュを削除する場合です。

C#
url = url.TrimEnd('/');

これは分かりやすい書き方です。

一方で、複数の文字を指定する場合は、意図が分かりにくくなることがあります。

C#
text = text.TrimEnd('a', 'b', 'c', '1', '2', '3');

このような場合は、変数に分けると読みやすくなります。

C#
char[] trimChars = { 'a', 'b', 'c', '1', '2', '3' };
text = text.TrimEnd(trimChars);

特定の意味を持つ処理なら、メソッド化するのもおすすめです。

C#
static string RemoveTrailingSlash(string text)
{
return text?.TrimEnd('/', '\\');
}

使う側は次のように書けます。

C#
path = RemoveTrailingSlash(path);

処理の意味が明確になり、保守しやすくなります。

10. TrimEndに関するよくある質問

10-1. TrimEndで改行コードは削除できる?

はい、削除できます。

引数なしのTrimEnd()を使うと、末尾の空白文字として改行コードも削除されます。

C#
string text = "Hello\r\n";
string result = text.TrimEnd();

Console.WriteLine($"[{result}]");

実行結果です。

C#
[Hello]

改行コードだけを削除したい場合は、明示的に指定します。

C#
string result = text.TrimEnd('\r', '\n');

この書き方なら、末尾の半角スペースやタブは削除対象になりません。

10-2. TrimEndで全角スペースだけを削除するには?

全角スペースだけを削除したい場合は、全角スペースを文字として指定します。

C#
string text = "こんにちは  ";
string result = text.TrimEnd(' ');

Console.WriteLine($"[{result}]");

実行結果です。

C#
[こんにちは]

半角スペースと全角スペースの両方を削除したい場合は、次のように指定します。

C#
string result = text.TrimEnd(' ', ' ');

引数なしのTrimEnd()でも全角スペースは削除対象になりますが、削除対象を限定したい場合は明示的に指定するとよいです。

10-3. TrimEndで末尾のスラッシュを削除するには?

末尾のスラッシュを削除するには、'/'を指定します。

C#
string url = "https://example.com/";
string result = url.TrimEnd('/');

Console.WriteLine(result);

実行結果です。

C#
https://example.com

Windowsのパス区切り文字であるバックスラッシュも削除したい場合は、次のように書きます。

C#
string path = @"C:\Temp\";
string result = path.TrimEnd('\\');

Console.WriteLine(result);

実行結果です。

C#
C:\Temp

両方に対応するなら、次のように複数指定します。

C#
string result = path.TrimEnd('/', '\\');

10-4. TrimEndで文字列の最後の1文字だけを削除できる?

TrimEndは、指定した文字が末尾に連続している場合、すべて削除します。そのため、「最後の1文字だけを必ず削除したい」という用途には向いていません。

たとえば、次のコードを見てください。

C#
string text = "Hello!!!";
string result = text.TrimEnd('!');

Console.WriteLine(result);

実行結果です。

C#
Hello

!が1つだけではなく、すべて削除されます。

最後の1文字だけを削除したい場合は、SubstringやRange構文を使います。

C#
string text = "Hello!";

if (!string.IsNullOrEmpty(text))
{
text = text.Substring(0, text.Length - 1);
}

Console.WriteLine(text);

実行結果です。

C#
Hello

C# 8.0以降なら、次のようにも書けます。

C#
if (!string.IsNullOrEmpty(text))
{
text = text[..^1];
}

「末尾にある特定文字をすべて削除したい」ならTrimEnd、「最後の1文字だけ削除したい」ならSubstringやRangeを使いましょう。

10-5. TrimEndと正規表現はどちらを使うべき?

単純に末尾の空白や特定文字を削除したいだけなら、TrimEndを使うのがおすすめです。

C#
string result = text.TrimEnd();

または、特定文字を削除します。

C#
string result = text.TrimEnd(',');

正規表現は、より複雑な条件で削除したい場合に向いています。

たとえば、末尾の数字をすべて削除する場合です。

C#
using System.Text.RegularExpressions;

string text = "Item123";
string result = Regex.Replace(text, @"\d+$", "");

Console.WriteLine(result);

実行結果です。

C#
Item

ただし、削除対象の数字が123だけなら、TrimEndでも対応できます。

C#
string result = text.TrimEnd('0', '1', '2', '3', '4', '5', '6', '7', '8', '9');

シンプルな末尾削除ならTrimEnd、パターンに基づいた複雑な削除なら正規表現、という使い分けが基本です。

まとめ

C#のTrimEndは、文字列の末尾にある空白や指定した文字を削除するための便利なメソッドです。

引数なしで使うと、末尾の空白文字を削除できます。

C#
string result = text.TrimEnd();

指定した文字を削除したい場合は、次のように書きます。

C#
string result = text.TrimEnd(',');

複数の文字も指定できます。

C#
string result = text.TrimEnd('/', '\\');

ただし、TrimEndは元の文字列を直接変更しません。戻り値として新しい文字列を返すため、必ず変数に代入する必要があります。

C#
text = text.TrimEnd();

また、TrimEndは文字列の末尾だけを処理します。先頭を削除したい場合はTrimStart、両端を削除したい場合はTrimを使います。

C#
text.TrimStart();
text.TrimEnd();
text.Trim();

注意点として、TrimEndは「文字列」ではなく「文字」を削除するメソッドです。末尾の.txt/apiのような特定の文字列を削除したい場合は、EndsWithSubstringRemove、Range構文などを使うほうが安全です。

C#
if (text.EndsWith(suffix, StringComparison.Ordinal))
{
text = text.Substring(0, text.Length - suffix.Length);
}

TrimEndは、ユーザー入力の整形、CSVの末尾カンマ削除、URLやファイルパスの末尾スラッシュ削除、ログの末尾改行削除など、実務でもよく使われるメソッドです。動作の仕組みと注意点を理解しておけば、文字列処理をより安全で読みやすく書けるようになります。