Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

概要

.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 版も作成したい。

yiaowang
仕事では、主に C#, VBA を使ってます。 個人的には、 Python 3 を勉強中です。
http://yiaowang.web.fc2.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away