Перемещение строки в C#
static void Main(string[] args)
{
string s = "ABCDEFGH";
string newS = ShiftString(s);
Console.WriteLine(newS);
}
public static string ShiftString(string t)
{
char[] c = t.ToCharArray();
char save = c[0];
for (int i = 0; i < c.Length; i++)
{
if (c[i] != c[0])
c[i] = c[i - 1];
}
Console.WriteLine(c);
String s = new string(c);
return s;
}
Мне нужно переместить строку s на одно пространство влево, поэтому я заканчиваю строку: "BCDEFGHA" Поэтому я подумал об изменении строки в массив символов и работе оттуда, но я не уверен, как успешно сделать эту работу. Я уверен, что мне нужен цикл for, но мне нужна помощь в том, как сдвинуть последовательность символов на одно пространство влево.
8 ответов
Как насчет этого?
public static string ShiftString(string t)
{
return t.Substring(1, t.Length - 1) + t.Substring(0, 1);
}
вы можете попробовать это:
s = s.Remove(0, 1) + s.Substring(0, 1);
как метод расширения:
public static class MyExtensions
{
public static string Shift(this string s, int count)
{
return s.Remove(0, count) + s.Substring(0, count);
}
}
затем вы можете использовать:
s = s.Shift(1);
алгоритм решения такого типа задачи о shift n позиции дублируют строку, объединяют вместе и получают подстроку. ( Н )
string s = "ABCDEFGH";
string ss = s + s; // "ABCDEFGHABCDEFGH"
Если вы хотите shift n позиции, вы можете сделать
var result = ss.Substring(n, s.length);
лично я бы сделал так:
public static string ShiftString(string t){
string firstLetter = t.Substring(0, 1);
return t.Substring(1) + firstLetter;
}
вы можете воспользоваться тем, что string
is IEnumerable<char>
:
public static string ShiftString(string t){
return new String(t.Skip(1).Concat(t).Take(t.Length).ToArray());
}
класс StringBuilder дает вам лучшую производительность
static string ShiftString(string str)
{
if (str == null) throw new ArgumentNullException();
int strLen = str.Length;
if (strLen == 0) return string.Empty;
StringBuilder sb = new StringBuilder(strLen);
sb.Append(str, 1, strLen - 1);
sb.Append(str[0]);
return sb.ToString();
}
ниже методы принимают число n, которое говорит, сколько раз вы хотите переместить/повернуть строку. Я взял МОД по длине строки, если число больше длины строки.
public static void Rotate(ref string str, int n)
{
//if the rotation/shift number is less than or =0 throw exception
if (n < 1)
throw new Exception("Negative number for rotation");
//if the String is less than 1 character no need to shift
if (str.Length < 1) throw new Exception("0 length string");
if (n > str.Length) // If number is greater than the length of the string then take MOD of the number
{
n = n % str.Length;
}
StringBuilder s1=new StringBuilder(str.Substring(n,(str.Length - n)));
s1.Append(str.Substring(0,n));
str=s1.ToString();
}
// / Вы можете использовать Skip и принимать функции строковых операций
public static void Rotate1(ref string str, int n)
{
if (n < 1)
throw new Exception("Negative number for rotation"); ;
if (str.Length < 1) throw new Exception("0 length string");
if (n > str.Length)
{
n = n % str.Length;
}
str = String.Concat(str.Skip(n).Concat(str.Take(n)));
}
вы также можете достичь этого с помощью простого оператора LINQ:
Примечание: то же самое может быть достигнуто с помощью простого for и/или while loop
string a = "ABCDEFGH";
a = new string(Enumerable.Range(0, a.Length).Select(i => (a[(i+1)%a.Length])).ToArray());