Architect's Log

I'm a Cloud Architect. I'm highly motivated to reduce toils with driving DevOps.

【.NET】指定された文字列を文字列の先頭から削除する拡張メソッドString.TrimStart

String.TrimStartは、引数がcharです。Stringが引数のオーバーロードを書いてみました。

StringExtensions.cs

using System;

namespace Extensions {
    public static class StringExtensions {
        /// <summary>
        /// 文字列の先頭から、指定された文字列を削除します。
        /// </summary>
        /// <param name="self">System.Stringのインスタンス。</param>
        /// <param name="trimString">削除する文字列。</param>
        /// <returns>
        /// 現在の文字列の先頭から、<paramref name="trimStrig"/>パラメーターの文字をすべて削除した後に残った文字列。 
        /// <paramref name="trimStrig"/>がnullまたは空の場合は、代わりに空白文字が削除されます。
        /// </returns>
        public static string TrimStart(this string self, string trimString) {
            if (self == null)
                throw new NullReferenceException(string.Format("Null文字列に対して{0}を呼び出すことはできません。", nameof(TrimStart)));

            if (string.IsNullOrEmpty(trimString))
                return self.TrimStart(' ').TrimStart(' ');

            if (string.IsNullOrEmpty(self))
                return self;

            if (self.StartsWith(trimString))
                return self.Substring(trimString.Length, self.Length - trimString.Length);

            return self;
        }
    }
}

ユニットテスト

using Extensions;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System;

namespace ExtensionsTest {
    [TestClass]
    public class TrimStartTest {
        [TestMethod]
        public void 先頭の文字列が一致() {
            string source = "ababe";
            string trimString = "ab";

            string expected = "abe";
            string actual = source.TrimStart(trimString);
            Assert.AreEqual(expected, actual);
        }

        [TestMethod]
        public void 先頭の文字列が不一致() {
            string source = "ababe";
            string trimString = "bc";

            string expected = "ababe";
            string actual = source.TrimStart(trimString);
            Assert.AreEqual(expected, actual);
        }

        [TestMethod]
        [ExpectedException(typeof(NullReferenceException))]
        public void 文字列がnull() {
            string source = null;
            string trimString = "bc";

            string actual = source.TrimStart(trimString);
        }

        [TestMethod]
        public void 文字列が空() {
            string source = "";
            string trimString = "bc";

            string expected = "";
            string actual = source.TrimStart(trimString);
            Assert.AreEqual(expected, actual);
        }

        [TestMethod]
        public void 文字列が半角スペースで不一致() {
            string source = " ";
            string trimString = "bc";

            string expected = " ";
            string actual = source.TrimStart(trimString);
            Assert.AreEqual(expected, actual);
        }

        [TestMethod]
        public void 文字列が全角スペースで不一致() {
            string source = " ";
            string trimString = "bc";

            string expected = " ";
            string actual = source.TrimStart(trimString);
            Assert.AreEqual(expected, actual);
        }

        [TestMethod]
        public void 文字列が半角スペースで一致() {
            string source = " abcde";
            string trimString = " ";

            string expected = "abcde";
            string actual = source.TrimStart(trimString);
            Assert.AreEqual(expected, actual);
        }

        [TestMethod]
        public void 文字列が全角スペースで一致() {
            string source = " abcde";
            string trimString = " ";

            string expected = "abcde";
            string actual = source.TrimStart(trimString);
            Assert.AreEqual(expected, actual);
        }

        [TestMethod]
        public void trimStringがnullの場合は半角スペースが削除される() {
            string source = "  abcde";
            string trimString = null;

            string expected = "abcde";
            string actual = source.TrimStart(trimString);
            Assert.AreEqual(expected, actual);
        }

        [TestMethod]
        public void trimStringが空の場合は半角スペースが削除される() {
            string source = "  abcde";
            string trimString = "";

            string expected = "abcde";
            string actual = source.TrimStart(trimString);
            Assert.AreEqual(expected, actual);
        }

        [TestMethod]
        public void trimStringがnullの場合は全角スペースが削除される() {
            string source = "  abcde";
            string trimString = null;

            string expected = "abcde";
            string actual = source.TrimStart(trimString);
            Assert.AreEqual(expected, actual);
        }
    }
}

テスト結果

f:id:JHashimoto:20160111140023p:plain