2020年09月07日
川俣晶の縁側ソフトウェアC# コーディング How To total 1021 count

【入門級】文字列の最後の1文字を取得する。最後の2文字を取得する

Written By: 川俣 晶連絡先

最後の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文字は【瞳子】です。

COOL C# CREW

C#ハウツー連載の解説増量、カラーのソース、新規書き下ろし追加の読みやすい単行本はこちら。

C#ハウツー: 逆引き入門・こんな機能はどう書くの?