【Unity】文字列の最後の1文字を取得する【拡張メソッド】
文字列の末尾文字を取得する時,@string.ToCharArray()[@string.Length - 1]といった回りくどい表現をする事になると思います。
今回はこれを@string.LastChar()という,明瞭な表現で実行できる拡張メソッドを作りました。
本稿では,LINQ のメソッドである Last()も交えて御説明いたします。
(Unity 2018.3.0f2)
スクリプトの用意
まずは,拡張メソッド用のスクリプトを用意します。
これで,文字列クラスstringにGetLastChar()というメソッドを追加できました。
メソッド名からも分かるように,返り値はcharになります。
結果をstringで取得したい場合は,更にToString()メソッドを使用しましょう。
使用例
NewBehaviourScript.cs
using UnityEngine; // 拡張メソッド GetLastChar() を使うため using LastChar; public class NewBehaviourScript : MonoBehaviour { void Start() { // string1 var string1 = "string1"; Debug.Log(string1.LastChar()); // string2 var string2 = "string2"; Debug.Log(string2.LastChar(0)); // string3 var string3 = "string3"; Debug.Log(string3.LastChar(-1)); // string4 var string4 = "string4"; Debug.Log(string4.LastChar(1)); } }

解説
まずは拡張メソッドクラスであるLastCharを,using staticディレクティブで指定します。
これはLastを拡張クラスとするうえで,静的(static)にする必要があったためです。
/// <summary> /// 文字列の末尾文字を取得する静的クラス /// </summary> [Obsolete("This class is obsolete. Call TsuGames.Last instead.")] public static class Last
例外メッセージを定義していますが,constではなくstatic readonly修飾子を使用しています。
これは定数のように扱いたいものの,後に変更する可能性がある場合の対処法です。
// shift の例外メッセージ static readonly string ShiftExceptionMessage = "\"shift\" must be opposite of a count in container to 0.";
整数型intの引数shiftによって「最後から-shift番目の文字」も取得できるよう,オーバーロードメソッドを定義しています。
/// <summary> /// 文字列の末尾文字 /// </summary> /// <param name="str">文字列</param> /// <param name="shift">末尾インデックスからのシフト(0以下)</param> /// <returns>指定したインデックス番号の文字</returns> [Obsolete("This method is obsolete. Call TsuGames.Last.LastChar instead.")] public static char GetLastChar(this string str, int shift)
shiftの値が範囲外だった時に例外メッセージを表示するため,try-catchキーワードを使います。
引数が範囲外だった場合の操作は,ArgumentOutOfRangeExceptionクラスで行います。
catchブロック内で明示的にthrowキーワードを使うと,専用の例外メッセージを表示できます。
ToCharArray()メソッドで,文字列stringを文字配列char[]に変換しています。
// 例外が生じるおそれのある命令 try { // 指定したインデックス番号の文字を返す return str.ToCharArray(LastIndexNumberOf(str) + shift, 1)[0]; } // 引数の例外をキャッチした場合 catch (ArgumentOutOfRangeException) { // 例外を投げる throw new ArgumentOutOfRangeException(nameof(shift), ShiftExceptionMessage); }
オーバーロードで共通する部分は,LastIndexNumberOf()メソッドとして独立させています。
/// <summary> /// 文字列の末尾インデックス番号 /// </summary> /// <param name="str">文字列</param> /// <returns>末尾インデックス番号</returns> static int LastIndexNumberOf(string str)
Enumerable.Last メソッドとの違い
LINQ のLast()メソッドでも末尾文字を取得できますが,GetLastChar()メソッドは「末尾から○番目の文字」を選べます。
短所は,Last()メソッドにあるような「条件に該当する要素の中で最後の文字」という指定が出来ない点です。
可読性の補助が目的であるため,機能は絞った物となりました。
御要望がございましたら,機能の追加や変更も検討いたします。
以上,文字列の末尾文字を取得する拡張メソッドの御紹介でした。
同じように配列やリストの末尾要素を取得する方法については,以下の記事をご覧くださいませ。
上記の機能と統合した拡張メソッドも,以下の記事にて紹介しております。