文字列の末尾文字を取得する時,@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()
メソッドにあるような「条件に該当する要素の中で最後の文字」という指定が出来ない点です。
可読性の補助が目的であるため,機能は絞った物となりました。
御要望がございましたら,機能の追加や変更も検討いたします。
以上,文字列の末尾文字を取得する拡張メソッドの御紹介でした。
同じように配列やリストの末尾要素を取得する方法については,以下の記事をご覧くださいませ。
上記の機能と統合した拡張メソッドも,以下の記事にて紹介しております。