实际上,如果不至少分配与要反转的字符串所占用的内存量相同的内存量,就没有正确的方法来反转字符串。(理论上它可以在内存中反转一个字符串,但这是非常不推荐的,我什至不会进入那个区域)。现在至于反转字符串本身。我正在做一个名为 StringExtensions 的小项目,在这个项目中,我尝试解决使用字符串时可能出现的所有问题。最大的问题之一是使用在整个框架中广泛使用的 UTF-16 编码。我反转字符串的实现如下所示:
static IEnumerable<Tuple<int, int>> GetTextElementSegments(string value)
{
int[] elementOffsets = StringInfo.ParseCombiningCharacters(value);
int lastOffset = -1;
foreach (int offset in elementOffsets)
{
if (lastOffset != -1)
{
int elementLength = offset - lastOffset;
Tuple<int, int> segment = new Tuple<int,int>(lastOffset, elementLength);
yield return segment;
}
lastOffset = offset;
}
if (lastOffset != -1)
{
int lastSegmentLength = value.Length - lastOffset;
Tuple<int, int> segment = new Tuple<int, int>(lastOffset, lastSegmentLength);
yield return segment;
}
}
static void Main(string[] args)
{
string input = "t\u0301e\u0302s\u0303t\u0304";
StringBuilder resultBuilder = new StringBuilder(input.Length);
var segments = GetTextElementSegments(input);
foreach (var segment in segments.Reverse())
{
resultBuilder.Append(input, segment.Item1, segment.Item2);
}
Debug.Assert(resultBuilder.ToString() == "t\u0304s\u0303e\u0302t\u0301s");
}
请注意,这会处理代理对、unicode 标记代码点,并且只分配与输入字符串本身占用的内存量相似的内存。