wiprog

C#, .NET, Scala ... について勉強したことのメモ

C# Span<char> を使って snake_case な文字列を PascalCase に変換する

ネットで検索してもなかなか良い実装が見つからなかったので自分で書きました。

他の実装と違う点として、

  • 部分文字列 (string インスタンス) を一切アロケートしない
  • 極力すべての操作を stack 上で済ませる

ことで、パフォーマンスを意識した作りにしています。

public static string SnakeCaseToPascalCase(this string snake)
{
    ReadOnlySpan<char> snakeSpan = snake;
    Span<char> buffer = stackalloc char[snakeSpan.Length];

    int bufferPos = 0;
    bool toUpper = true;
    for (var i = 0; i < snake.Length; i++)
    {
        var target = snakeSpan[i];
        
        if (target == '_')
        {
            toUpper = true;
        }
        else
        {
            buffer[bufferPos++] = toUpper ? char.ToUpper(target) : target;
            toUpper = false;
        }
    }

    return buffer.Slice(0, bufferPos).ToString();
}