ОБНОВЛЕНИЕ : в нижней части этого ответа приведен один действительно ужасающий результат изменения строки на месте в .NET.
«Хороший» ответ
В .NET нет перегрузки Array.Reverse
, которая принимает string
. Тем не менее, вот как можно реализовать, если бы он существовал:
static string ReverseString(string str) {
char[] reversed = new char[str.Length];
for (int i = 0; i < reversed.Length; ++i)
reversed[i] = str[str.Length - 1 - i];
return new string(reversed);
}
Обратите внимание, что в .NET этот метод должен возвращать a string
, поскольку тип System.String
является неизменным, и поэтому вы не можете повернуть один на месте.
Страшный ответ
OK, на самом деле, - это , позволяющий перевернуть строку на месте в .NET .
Вот один способ, который требует компиляции в режиме unsafe
:
static unsafe void ReverseString(string str) {
int i = 0;
int j = str.Length - 1;
fixed (char* fstr = str) {
while (i < j) {
char temp = fstr[j];
fstr[j--] = fstr[i];
fstr[i++] = temp;
}
}
}
А вот еще один способ, который использует отражение и не должен быть скомпилирован в режиме unsafe
:
static void ReverseString(string str) {
int i = 0;
int j = str.Length - 1;
// what a tricky bastard!
MethodInfo setter = typeof(string).GetMethod(
"SetChar",
BindingFlags.Instance | BindingFlags.NonPublic
);
while (i < j) {
char temp = str[j];
setter.Invoke(str, new object[] { j--, str[i] });
setter.Invoke(str, new object[] { i++, temp });
}
}
Совершенно нецелесообразно и безрассудно, да - не говоря уже о том, что он, скорее всего, будет иметь ужасных производительность. Но, тем не менее, возможно.
Ужас
О, и, кстати, на случай, если у вас возникнут какие-либо сомнения в том, что вы должны никогда не делать ничего подобного : знайте, что любой из ReverseString
методов, которые я предоставил выше, будет фактически позволяет вам написать следующую совершенно странную программу:
ReverseString("Hello!");
Console.WriteLine("Hello!");
Приведенный выше код выведет, хотите верьте, хотите нет *:
!olleH
Так что, да, если вы не хотите, чтобы весь ад вырвался из вашего кода, не переворачивайте строку на месте. Хотя технически вы можете;)
* Вы можете попробовать это сами, если не верите мне.