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".
请注意,第二种解决方案仅适用于创建大量此类旋转的情况。一行代码更容易理解。
我正从 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".
请注意,第二种解决方案仅适用于创建大量此类旋转的情况。一行代码更容易理解。