C#
slice
substring

C# の string で Python の Slice を実装してみる

概要

.NET の string.SubString() は、length に文字列の長さ以外を設定するとエラーになったりして、使い勝手が悪いので、Python の スライスと同等の関数を作ってみました。

実装

定義

  public static class StringEx
  {
    /// <summary>
    /// Python の スライスと同じ結果を取得します。
    /// </summary>
    /// <param name="target">このインスタンス。</param>
    /// <param name="startIndex">開始文字位置。</param>
    /// <returns>
    /// このインスタンスの startIndex で始まる部分文字列と等価もしくは取得可能な文字列。
    /// </returns>
    public static string Slice(this string target, int startIndex)
    {
      if (target == null) return "";
      if (target.Length < startIndex) return "";
      return Slice(target, startIndex, target.Length);
    }

    /// <summary>
    /// Python の スライスと同じ結果を取得します。
    /// </summary>
    /// <param name="target">このインスタンス。</param>
    /// <param name="startIndex">開始文字位置。</param>
    /// <param name="endIndex">終了文字位置。</param>
    /// <returns>
    /// このインスタンスの startIndex から endIndex までの部分文字列と等価もしくは取得可能な文字列。
    /// </returns>
    public static string Slice(this string target, int startIndex, int endIndex)
    {
      if (target == null) return "";
      int targetLen = target.Length;
      if (targetLen < startIndex) return "";
      if (startIndex < 0)
      {
        startIndex = targetLen + startIndex;
        if (startIndex < 0) startIndex = 0;
      }
      if (endIndex < 0)
      {
        endIndex = targetLen + endIndex;
        if (endIndex < 0) endIndex = 0;
      }
      if (startIndex >= endIndex)
      {
        return "";
      }
      int len = endIndex > targetLen ? targetLen - startIndex : endIndex - startIndex;
      return target.Substring(startIndex, len);
    }
  }

呼び出し

Console.WriteLine("abcde".Slice(0));   // "abcde"
Console.WriteLine("abcde".Slice(1));   // "bcde"
Console.WriteLine("abcde".Slice(3));   // "de"
Console.WriteLine("abcde".Slice(5));   // ""

Console.WriteLine("abcde".Slice(-1));  // "e"

Console.WriteLine("abcde".Slice(3,4)); // "d"

補足

拡張メソッドを使った実装になります。呼び出し先で StringEx に対して using を記載してください。

編集後記

余裕があれば、Collection 版も作成したい。