文字列を逆にするこのメソッドを作成しました
public string Reverse(string s)
{
if(string.IsNullOrEmpty(s))
return s;
TextElementEnumerator enumerator =
StringInfo.GetTextElementEnumerator(s);
var elements = new List<char>();
while (enumerator.MoveNext())
{
var cs = enumerator.GetTextElement().ToCharArray();
if (cs.Length > 1)
{
elements.AddRange(cs.Reverse());
}
else
{
elements.AddRange(cs);
}
}
elements.Reverse();
return string.Concat(elements);
}
ここで、このコードをより効率的にする方法や、代わりに使用できるライナーが 1 つある方法についての議論を開始したくありません。このコードを潜在的に改善するために、Xor やその他のあらゆる種類のことを実行できることを認識しています。後でコードをリファクタリングしたい場合は、単体テストがあるので簡単に行うことができます。
現在、これは BML 文字列 ( のようなアクセント付きの文字"Les Misérables"
列を含む) と、 のような結合文字を含む文字列を正しく反転し"Les Mise\u0301rables"
ます。
サロゲートペアを含む私のテストは、次のように表現されている場合に機能します
Assert.AreEqual("", _stringOperations.Reverse(""));
しかし、サロゲートペアをこのように表現すると
Assert.AreEqual("\u10000", _stringOperations.Reverse("\u10000"));
その後、テストは失敗します。サロゲートペアもサポートする気密実装はありますか?
私が上記の間違いを犯した場合、私は Unicode の専門家ではないので、これを指摘してください。