LoginSignup
2
2

More than 1 year has passed since last update.

C# Splitを使って文字列を文字数で分割できるか?

Last updated at Posted at 2022-02-23

できません。orz
セパレーター(char)が無いと何ともできません。
不便なのでSplitByLengthなる関数を作ったりしましたが、拡張メソッドのほうが格好良くね?
ということでネットで調べて作りました。

【追記】
最初の投稿にいくつかコメントをいただきまして、勝手に完成度の高いものになってしまいました。
Qiita恐るべしです。

サロゲートペアに対応

@ktz_aliasさんからサロゲートペアがあると文字化けするとコメントとコードをいただきました。
サロゲートペアって何?美味しいの?ってくらいに知らなかったんですが、4バイト文字だったのね。
@ktz_aliasさん、ありがとうございました。

丸写し
    public static class StringExtensions
    {
        /// <summary>
        /// 指定の文字数で分割
        /// </summary>
        /// <param name="value">分割する文字列</param>
        /// <param name="maxLength">分割する文字数</param>
        /// <returns>配列</returns>
        public static IEnumerable<string> Split(this string value, int maxLength)
        {
            var info = new StringInfo(value);
            var len = info.LengthInTextElements;

            var p0 = 0;
            var p1 = maxLength;

            while (p0 < len)
            {
                if (p1 > len)
                {
                    p1 = len;
                }

                yield return info.SubstringByTextElements(p0, p1 - p0);

                p0 = p1;
                p1 += maxLength;
            }
        }
    }

.NET6版(サロゲートペア非対応)

@htsignさんから、.NET 6からChunkメソッドが使えると教えていただきました。
サロゲートペアがなんぼのもんじゃい!という方はぜひ。
とても簡潔に記述できます。
@htsignさん、ありがとうございました。

こちらも丸写し
    public static class StringExtensions
    {
        /// <summary>
        /// 指定の文字数で分割
        /// </summary>
        /// <param name="value">分割する文字列</param>
        /// <param name="maxLength">分割する文字数</param>
        /// <returns>配列</returns>
        public static string[] Split(this string value, int maxLength)
        {
            return value.Chunk(maxLength).Select(cs => new string(cs)).ToArray();
        }
    }
2
2
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2