【C#.NET解説】 効率的な文字列の結合 Stringより速い「StringBuilder」 ~メモリ消費を抑えて高速処理を実現~

2024年11月8日金曜日

基本 文字列操作

t f B! P L

名前空間:System.Text

自己紹介

まあまあ、ちょっと腰を落ち着けてお聞きなさい。私は多くの知恵を司る者。今日話すのは「StringBuilder」よ。このクラスは、文字列を操作する際にとても頼りになる存在なの。あなたが「文字列の結合や編集が遅くなってきたな」と思うなら、それは「StringBuilder」の出番ということね。しっかりとその力を知り、使いこなせるようになりなさい。

基本機能

「StringBuilder」は、文字列を効率よく扱うために設計されているわ。「string」は変更不可能(immutable)だけれど、「StringBuilder」は内容を変更できるの。例えば、文字列を何度も結合する場合、「string」を使うとそのたびに新しいインスタンスが作られるわ。でも、「StringBuilder」なら、同じインスタンスを使って操作できるから無駄がないのよ。

C#

using System;
using System.Text;

class Program
{
    static void Main()
    {
        StringBuilder sb = new StringBuilder("こんにちは");
        sb.Append(" 世界");
        sb.Append("!");
        Console.WriteLine(sb.ToString()); // 出力: こんにちは 世界!
    }
}

よく使う場面と注意点

「StringBuilder」は、特に「繰り返し文字列を変更する場面」で活躍するわ。例えば、ログを作成するときや、大量の文字列を処理するときに使うと良いわね。

ただし、「短い文字列の操作」や「変更回数が少ない場合」には「string」の方が適していることもあるわ。使いどころを見極めるのが大切よ。

C#

using System;
using System.Text;

class Program
{
    static void Main()
    {
        string text = "A";
        for (int i = 0; i < 1000; i++)
        {
            text += "A"; // これだと毎回新しい文字列が作られ、メモリの無駄
        }
        
        StringBuilder sb = new StringBuilder("A");
        for (int i = 0; i < 1000; i++)
        {
            sb.Append("A"); // StringBuilderなら効率的に処理
        }
    }
}

さまざまなメソッドの紹介

「StringBuilder」は多くのメソッドを持っているわ。ここでいくつか紹介するわね。

  • Append() - 文字列を追加
  • Insert() - 指定位置に文字列を挿入
  • Remove() - 指定範囲の文字列を削除
  • Replace() - 文字列の置換
  • Clear() - 内容をクリア
C#

using System;
using System.Text;

class Program
{
    static void Main()
    {
        StringBuilder sb = new StringBuilder("こんにちは 世界");
        
        sb.Insert(5, "、"); // 「こんにちは、世界」にする
        sb.Replace("世界", "皆さん"); // 「こんにちは、皆さん」に置換
        sb.Remove(0, 5); // 「、皆さん」から「皆さん」にする
        
        Console.WriteLine(sb.ToString());
    }
}

具体的な使い方

大きなファイルを1行ずつ読み込み、処理する際にも「StringBuilder」が役立つわよ。例えば、1000行から2000行目だけを読み取るにはこうするの。

C#

using System;
using System.IO;
using System.Text;

class Program
{
    static void Main()
    {
        StringBuilder sb = new StringBuilder();
        int startLine = 1000;
        int endLine = 2000;
        int currentLine = 0;
        
        using (StreamReader reader = new StreamReader("example.txt"))
        {
            while (!reader.EndOfStream)
            {
                string line = reader.ReadLine();
                if (currentLine >= startLine && currentLine lt;= endLine)
                {
                    sb.AppendLine(line);
                }
                if (currentLine > endLine) break;
                currentLine++;
            }
        }
        
        Console.WriteLine(sb.ToString());
    }
}

その他の便利なメソッド

最後に、「StringBuilder」の便利なメソッドを紹介しておくわね。

  • Length - 現在の文字数を取得
  • Capacity - 内部バッファの容量を取得または設定
  • EnsureCapacity() - バッファ容量を確保
C#

using System;
using System.Text;

class Program
{
    static void Main()
    {
        StringBuilder sb = new StringBuilder("こんにちは");
        Console.WriteLine(sb.Length); // 5
        Console.WriteLine(sb.Capacity); // 16(デフォルト)

        sb.EnsureCapacity(100);
        Console.WriteLine(sb.Capacity); // 100 以上になる
    }
}

これで「StringBuilder」の基礎から応用まで学べたわね。状況に応じて適切な方法を選び、効率的にコードを書いてちょうだい。

このブログを検索

QooQ