Architect's Log

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

【.NET】文字列を行に分割する拡張メソッドSplitToLines

文字列を行に分割する拡張メソッドSplitToLinesです。

拡張メソッドのソースコード

using System;
using System.Collections.Generic;
using System.Linq;

namespace Extensions {
    static class StringExtensions {
        /// <summary>
        /// 文字列を行に分割し、列挙可能にします。
        /// </summary>
        /// <param name="self">System.Stringのインスタンス。</param>
        /// <param name="options">
        /// 空の要素を省略する場合はStringSplitOptions.RemoveEmptyEntries。
        /// 空の要素も含める場合はStringSplitOptions.None。</param>
        /// <returns>分割された行。</returns>
        /// <remarks>
        /// 改行コードは、キャリッジリターン、ラインフィード、キャリッジリターン + ラインフィードのどれでもかまいません。
        /// </remarks>
        public static IEnumerable<string> SplitToLines(this string self, StringSplitOptions options) {
            if (string.IsNullOrEmpty(self))
                yield break;

            string s = self.Replace("\r\n", "\n").Replace('\r', '\n');

            foreach (string line in s.Split(new char[] { '\n' }, options)) {
                yield return line;
            }
        }

        /// <summary>
        /// 文字列を行に分割し、列挙可能にします。
        /// </summary>
        /// <param name="self">System.Stringのインスタンス。</param>
        /// <returns>分割された行。</returns>
        /// <remarks>
        /// <para>空の要素は省略します。</para>
        /// <para>
        /// 改行コードは、キャリッジリターン、ラインフィード、キャリッジリターン + ラインフィードのどれでもかまいません。
        /// </para>
        /// </remarks>
        public static IEnumerable<string> SplitToLines(this string self) {
            return self.SplitToLines(StringSplitOptions.RemoveEmptyEntries);
        }
    }
}

拡張メソッドのテスト

テストに使用する文字列

3種類の改行コードが混在する以下の文字列をファイルで用意します。このファイルを読み込んでテストします。
f:id:JHashimoto:20151124224144p:plain

テストコード

using System;
using System.IO;

namespace Extensions {
    class Program {
        static void Main(string[] args) {
            string text = File.ReadAllText(@"c:\text.txt");
            foreach (string s in text.SplitToLines()) {
                Console.WriteLine(s);
            }

            string nullText = null;
            foreach (string s in nullText.SplitToLines()) {
                Console.WriteLine(s);
            }

            Console.WriteLine("出力終了");
            Console.ReadKey();
        }
    }
}

テスト結果

f:id:JHashimoto:20151124224153p:plain