[C#]文字列を文字数ごとに分割するには?

C#

どうも、ちょげ(@chogetarou)です。

文字列を特定の文字数ごとに分割する方法を紹介します。

スポンサーリンク

方法

インターフェース, インターネット, プログラム, ブラウザ, Www

文字列を特定の文字数ごとに分割する方法は、2つあります。

forループ

1つは、forループを使う方法です。

まず、forループします。

forループの変数の初期値に0、条件に変数が文字列の長さ未満を指定します。

forループの変数を分割する際の文字数でインクリメントします。

次に、ループ処理内でEnumerableに、文字列のSubstring()メソッドを渡します。

SubString()メソッドの第1引数にforループの変数、第2引数にMath.Min()を指定します。

そして、Math.Min()の第1引数に分割する際の文字数、第2引数に文字列の長さをループ変数で引いた値を指定します。

public static IEnumerable<string> Split(string text, int size)
{
    for(var i = 0; i < text.Length; i += size)
    {
        yield return text.Substring(i, Math.Min(size, text.Length - i));
    }
}

上記のforループは、文字列を特定の文字数ごとに分割したEnumerableを生成します。

上記の処理では、まず、Substring()で文字列から文字数ごとに切り取った文字列をEnumerable()に追加します。

そして、Math.Min()で文字数未満の場合に、残りの文字数で分割するようにします。

使用例

using System;
using System.Collections.Generic;
public class Example
{
    public static IEnumerable<string> Split(string text, int size)
    {
        if (String.IsNullOrEmpty(text) || size < 1) 
        {
            throw new ArgumentException();
        }
        
        for(var i = 0; i < text.Length; i += size)
        {
            yield return text.Substring(i, Math.Min(size, text.Length - i));
        }
    }
    
    public static void Main()
    {
        string text = "123456789";
        
        IEnumerable<string> names = Split(text, 3);
        
        foreach(var name in names)
        {
            Console.WriteLine(name);
        }
    }
}

/*
    出力:
    123
    456
    789
*/

System.Linq

もう1つは、System.Linqを使う方法です。

まず、System.Linqを導入します。

using System.Linq;

次に、EnumerableからRange()を呼び出します。

Range()のの第1引数に0を指定し、第2引数で文字列の長さを分割する際の文字数で割ります、

Range()からSelect()を呼び出します。

そして、Select()の引数に、文字列のSubstring()メソッドを返すラムダ式を指定します。

SubString()メソッドの第1引数にラムダ式の引数と文字数の積、第2引数に文字数を指定します。

//text=分割する文字列、size=分割する際の文字数
Enumerable.Range(0, text.Length / size)
         .Select(i => text.Substring(i * size, size))

上記のSelect()は、文字列を特定の文字数ごとに分割したEnumerableを返します。

上記の処理では、まず、Range()で必要な要素数までの数値を生成します。

そして、Range()で生成した数値を、Select()で文字列の特定の範囲の文字列に置換しています。

使用例

using System;
using System.Collections.Generic;
using System.Linq;
public class Example
{
    public static IEnumerable<string> Split(string text, int size)
    {
        if (String.IsNullOrEmpty(text) || size < 1) 
        {
            throw new ArgumentException();
        }
        
        return Enumerable.Range(0, text.Length / size)
                        .Select(i => text.Substring(i * size, size));
    }
    
    public static void Main()
    {
        string text = "123456789";
        
        IEnumerable<string> names = Split(text, 3);
        
        foreach(var name in names)
        {
            Console.WriteLine(name);
        }
    }
}
スポンサーリンク

まとめ

文字列を文字数ごとに分割する方法は、次の2つです。

  • forループを使う方法
  • System.Linqを使う方法

コメント

タイトルとURLをコピーしました