Что такое эквивалент std :: rotate () в C#? - PullRequest
0 голосов
/ 18 января 2020

Я перехожу на C# с C ++, и у меня возникают проблемы с переводом моего проекта на C#. Как выполнить

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

с помощью инструментов C#, где alphabet - это std::string с базовым c алфавитом.

1 Ответ

2 голосов
/ 18 января 2020

Не существует стандартной библиотечной функции, которая бы делала это за вас, вам нужно реализовать ее самостоятельно. Вот, пожалуй, самый простой способ сделать это:

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

Это выполняет два выделения строк, одно для Substring и одно для окончательного результата. Если ваши строки невелики и это не самый популярный путь в вашем коде, этого будет достаточно. Если вам нужна максимальная эффективность, используйте новую перегрузку string.Create из. NET Core 3.0:

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 строкой, и рецепт «перебирает source, пропуская свою первую букву и копируя ее в новую строку, а затем добавляет первую букву source в конце».

Обратите внимание, что второе решение применимо, только если вы создаете много таких вращений. Однострочник гораздо проще понять.

...