最後の1文字の判定と取得 §
最後の1文字の判定はEndsWithメソッドを使うだけでできます。簡単です。
しかし、取得はちょっと面倒です。
LINQが使えない場合は長さを取得するLengthプロパティとインデクサの合わせ技で取得します。
LINQが使える場合はLastメソッド一発で取得できます。
最後の2文字の判定と取得 §
2文字になっても判定方法は変わりません。EndsWithメソッドで判定できます。
問題は取得方法で、これは大きく変わります。
LINQが使えない場合はSubstringメソッドで部分文字列を抜き出します。
LINQが使える場合は最後のn文字を取得するTakeLastメソッドを使いますが、TakeLastメソッドはシーケンスを返すAPIであって文字列を返しません。そこで、配列に変換してからString型のコンストラクタに渡して文字列に置き換えます。
罠の数々 §
- 最後の1文字を取得するとき、インデックスを計算する際に付ける-1に注意。インデックスは0から数えるので、最後の1文字が文字列の長さマイナス1になる
- 同様に最後の2文字を取得するときの-2も注意
- Substringメソッドは第2引数を省略すると最後まで取得してくれる。本来なら第2引数の値は2であるが略しても同じ結果なので略してある
- Lastメソッドは取得するものが何もないと例外を発生させる。つまり空文字列に使うと必ず例外が起きる。LastOrDefaultメソッドを使えば例外が起きずに'\0'が返されるが、これでは最後の1文字が'\0'だったのか空文字列だったのか判定はできなくなる
- TakeLastメソッドは比較的実装が最近なので、少し古いバージョンだと利用できない可能性がある。互換の都合でフレームワークが古いプロジェクトが注意。(実装されているのは.NET Core系の比較的新しいバージョンのみ)
- LINQを使わない方法の方が高速に処理できる可能性がある。速度が重要な場合は注意しよう
- LINQを使わないで最後の2文字を取得する方法は、LINQを使う方法より短いが、-2というマジックナンバーが出現する弱点がある。TakeLastメソッドの引数の2は、【最後の2文字】の2なのでマジックナンバーではあるが読み取りやすい数字である
参考リンク §
String.EndsWith メソッド
String.Length プロパティ
String.Substring メソッド
Enumerable.Last メソッド
Enumerable.TakeLast メソッド
リポジトリ §
https://github.com/autumn009/cshowto
StringEnd §
using System;
using System.Linq;
class Program
{
static void Main()
{
const string src = "吉良瞳子";
// 最後の1文字が指定の文字か判定する
if (src.EndsWith("子")) Console.WriteLine("文字列の最後の1文字は【子】です。");
// LINQを使わない方法で最後の1文字を取得する
char ch1 = src[src.Length - 1];
Console.WriteLine($"文字列の最後の1文字は【{ch1}】です。");
// LINQを使う方法で最後の1文字を取得する
char ch2 = src.Last();
Console.WriteLine($"文字列の最後の1文字は【{ch2}】です。");
// 最後の2文字が指定の文字か判定する
if (src.EndsWith("瞳子")) Console.WriteLine("文字列の最後の2文字は【瞳子】です。");
// LINQを使わない方法で最後の2文字を取得する
string s1 = src.Substring(src.Length - 2);
Console.WriteLine($"文字列の最後の2文字は【{s1}】です。");
// LINQを使う方法で最後の2文字を取得する
string s2 = new string(src.TakeLast(2).ToArray());
Console.WriteLine($"文字列の最後の2文字は【{s2}】です。");
}
}
実行結果
文字列の最後の1文字は【子】です。
文字列の最後の1文字は【子】です。
文字列の最後の1文字は【子】です。
文字列の最後の2文字は【瞳子】です。
文字列の最後の2文字は【瞳子】です。
文字列の最後の2文字は【瞳子】です。