【以下は古い版の記事の内容です】
ある文字列の中の1文字だけを大文字・小文字に切り替える方法の紹介です。
C#の標準ライブラリにはこういった操作が存在しないので自分で実装することになります。今回は string クラスの拡張メソッドとして実装します。処理効率は特別な外部ライブラリを使用しない限り割と早い部類だと思います(検索して出てくるコードがいずれも効率がちょっと悪い感じだったので代替案として書いています。
先頭文字を大文字・小文字に変更する以外に番号を指定すればN文字目の大文字 ⇔ 小文字を変更することができます。
確認環境
今回の確認環境は以下の通りです。
- Unity 2019.4.10f1 & .NET Core 3.1
- VisualStudio 2019
- Windows10
実装コード
実装コードは以下の通りです。StringExtension クラスを作成して実装します。
// StringExtension.cs /// <summary> /// <see cref="string"/> クラスを拡張します。 /// </summary> public static class StringExtension { /// <summary> /// 指定した n 番目の文字を大文字に変換します。 /// </summary> public static string ToUpper(this string self, int no = 0) { if (no > self.Length) { return self; } var _array = self.ToCharArray(); var up = char.ToUpper(_array[no]); _array[no] = up; return new string(_array); } /// <summary> /// 指定した n 番目の文字を小文字に変換します。 /// </summary> public static string ToLower(this string self, int no = 0) { if (no > self.Length) { return self; } var _array = self.ToCharArray(); var up = char.ToLower(_array[no]); _array[no] = up; return new string(_array); } }
使い方
使い方は以下の通り。
string str = "abc123"; string newStr = str.ToUpper(0); // 先頭の文字を大文字に変換する // newStr = Abc123 string newStr_2 = str.ToUpper(3); // newStr_2 = abc123 // → 変換できない場合元の文字列が帰る
パフォーマンス
これでどれくらい改善されたかを BenchmarkDotNet で計測してみました。
Case1 が以前の記事の実装で、Case2 が今回の実装です。
| Method | Mean | Error | StdDev | Rank | Gen0 | Allocated | |------- |----------:|---------:|---------:|-----:|-------:|----------:| | Case1 | 147.05 ns | 67.49 ns | 3.699 ns | 2 | 0.0515 | 864 B | | Case2 | 65.97 ns | 77.87 ns | 4.268 ns | 1 | 0.0257 | 432 B |
速度が 2.2倍、ヒープ使用量が約半分となり実行効率が改善しました。
短いですが以上です。