Tsuの雑記¯\_(ツ)_/¯

主に製作メモ・備忘録として使用。製作したアプリのリンクもあります。

【Unity】文字列の最後の1文字を取得する【拡張メソッド】

文字列の末尾文字を取得する時,@string.ToCharArray()[@string.Length - 1]といった回りくどい表現をする事になると思います。

今回はこれを@string.LastChar()という,明瞭な表現で実行できる拡張メソッドを作りました。

本稿では,LINQ のメソッドである Last()も交えて御説明いたします。

(Unity 2018.3.0f2)


スクリプトの用意

まずは,拡張メソッド用のスクリプトを用意します。

unity3d.com

これで,文字列クラスstringGetLastChar()というメソッドを追加できました。

メソッド名からも分かるように,返り値はcharになります。

結果をstringで取得したい場合は,更にToString()メソッドを使用しましょう。

docs.microsoft.com


使用例

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));
    }
}

UnityEditor の Console 画面にログが表示されている画像
GetLastChar() それぞれの結果

解説

まずは拡張メソッドクラスであるLastCharを,using staticディレクティブで指定します。

docs.microsoft.com

これはLastを拡張クラスとするうえで,静的(static)にする必要があったためです。

/// <summary>
/// 文字列の末尾文字を取得する静的クラス
/// </summary>
[Obsolete("This class is obsolete. Call TsuGames.Last instead.")]
public static class Last

例外メッセージを定義していますが,constではなくstatic readonly修飾子を使用しています。

docs.microsoft.com

これは定数のように扱いたいものの,後に変更する可能性がある場合の対処法です。

docs.microsoft.com

// shift の例外メッセージ
static readonly string ShiftExceptionMessage = "\"shift\" must be opposite of a count in container to 0.";

整数型intの引数shiftによって「最後から-shift番目の文字」も取得できるよう,オーバーロードメソッドを定義しています。

docs.microsoft.com

/// <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キーワードを使います。

docs.microsoft.com

引数が範囲外だった場合の操作は,ArgumentOutOfRangeExceptionクラスで行います。

docs.microsoft.com

catchブロック内で明示的にthrowキーワードを使うと,専用の例外メッセージを表示できます。

docs.microsoft.com

ToCharArray()メソッドで,文字列stringを文字配列char[]に変換しています。

docs.microsoft.com

// 例外が生じるおそれのある命令
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 メソッドとの違い

LINQLast()メソッドでも末尾文字を取得できますが,GetLastChar()メソッドは「末尾から○番目の文字」を選べます。

docs.microsoft.com

短所は,Last()メソッドにあるような「条件に該当する要素の中で最後の文字」という指定が出来ない点です。

可読性の補助が目的であるため,機能は絞った物となりました。

御要望がございましたら,機能の追加や変更も検討いたします。

以上,文字列の末尾文字を取得する拡張メソッドの御紹介でした。

同じように配列やリストの末尾要素を取得する方法については,以下の記事をご覧くださいませ。

tsu-games.hatenablog.com

上記の機能と統合した拡張メソッドも,以下の記事にて紹介しております。

tsu-games.hatenablog.com