我写了这个方法来反转一个字符串
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);
}
现在,我不想开始讨论如何使这段代码更有效率,或者我如何可以使用一个衬垫。我知道您可以执行 Xors 和各种其他事情来潜在地改进此代码。如果我想稍后重构代码,我可以很容易地做到这一点,因为我有单元测试。
目前,这可以正确反转 BML 字符串(包括带有重音符号的字符串"Les Misérables"
)和包含组合字符(例如"Les Mise\u0301rables"
.
如果它们像这样表达,我的包含代理对的测试可以工作
Assert.AreEqual("", _stringOperations.Reverse(""));
但是如果我表达这样的代理对
Assert.AreEqual("\u10000", _stringOperations.Reverse("\u10000"));
然后测试失败。是否有一个密封的实现也支持代理对?
如果我在上面犯了任何错误,请指出这一点,因为我不是 Unicode 专家。