C# 中的 std::rotate() 等价物是什么?

What is the std::rotate() equivalent in C#?

我正从 C++ 迁移到 C#,但在将我的项目转换为 C# 时遇到了问题。如何执行

std::rotate(alphabet.rbegin(), alphabet.rbegin() + 1, alphabet.rend());

借助 C# 工具,其中 alphabet 是具有基本字母表的 std::string

没有标准库函数可以为您执行此操作,您需要自己实现。这可能是最简单的方法:

var result = alphabet.Substring(1) + alphabet[0];

这会执行两次字符串分配,一次分配给 Substring,一次分配给最终结果。如果您的字符串很小并且这不是您代码中的热路径,那么它就足够了。如果您关心效率最大化,请使用 .NET Core 3.0 中新的 string.Create 重载:

var result = string.Create(alphabet.Length, alphabet, (span, source) => 
{
    for (var i = 1; i < source.Length; ++i)
    {
        span[i - 1] = source[i];
    }
    span[source.Length - 1] = source[0];
});

String.Create 基本上将一些状态作为其输入,然后是关于如何使用该状态填充新字符串的 Span<char> 的方法。在这种情况下,状态是您的源 alphabet 字符串,配方是 "iterate over the source skipping its first letter and copy it to the new string, then add the first letter of source at the end".

请注意,第二种解决方案仅适用于创建大量此类旋转的情况。一行代码更容易理解。