2013-02-24 13 views
8
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; 
    } 

Мне нужно перенести в указатель на строку на одну позицию влево, так что я в конечном итоге со строкой: «BCDEFGHA» Так я думал об изменении строки в массив символов и работать мой путь оттуда, но я не уверен, как успешно выполнить эту работу. Я довольно уверен, что мне нужен цикл for, но мне нужна помощь в том, как сдвинуть последовательность символов на одно место слева.Сдвиг строки в C#

+0

Как выглядит результат? – spajce

+0

Вы сказали, что закончили с «BCDEFGHA». Разве это не то, чего вы ожидаете? Какой результат вы ожидаете, если ввести ввод «ABCDEFGH»? – zsong

+0

Извините, я, возможно, исправил его неправильно. Я ожидаю результат «BCDEFGHA», но это не то, что мой текущий выход. – user2104751

ответ

8

Как насчет этого?

public static string ShiftString(string t) 
{ 
    return t.Substring(1, t.Length - 1) + t.Substring(0, 1); 
} 
+0

Спасибо, это сработало, но я не уверен на 100%, как это работает. Было бы хорошо объяснить, почему это происходит? – user2104751

+0

Представьте, что у вас есть эта строка 'ABC'. эта часть 't.Substring (1, t.Length - 1) 'будет давать' BC', тогда как этот 't.Substring (0, 1)' вернет 'A'. –

+2

Ой, подождите, я знаю. T.Substring (1, t.Length - 1) переводится в «BCDEFGH» и t.Substring (0, 1), переведенные в «A», и путем их конкатенации мы получаем «BCDEFGHA»? – user2104751

7

Вы можете попробовать это:

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); 
+0

+1 для внесения его в расширение :) –

3

Лично я хотел бы сделать это:

public static string ShiftString(string t){ 
    string firstLetter = t.Substring(0, 1); 

    return t.Substring(1) + firstLetter; 
} 
+0

Извините, не может +1 вы за это, потому что этот ответ уже использовался. –

2

Вы можете воспользоваться тем, что string является IEnumerable<char>:

public static string ShiftString(string t){ 
    return new String(t.Skip(1).Concat(t).Take(t.Length).ToArray()); 
} 
1

Класс 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(); 
} 
5

Алгоритм для решения такого рода проблемы о сдвиге n позиции дублируют строку, объединяются вместе и получают подстроку. (п < длина (строка))

string s = "ABCDEFGH"; 
string ss = s + s; // "ABCDEFGHABCDEFGH" 

если вы хотите переместить п позиции, вы можете сделать

var result = ss.Substring(n, s.length); 
+0

+1 спасибо, этот подход действительно полезен –

1

Ниже методы принимают число п, который говорит, сколько раз вы хотите сдвинуть/повернуть строку. Я взял MOD по длине строки, если число больше длины строки.

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(); 


    } 

/// Вы можете сделать использование Перейти Брать и функцию операций Струнных

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))); 

    } 
0

вы также можете добиться того, что с помощью простого LINQ заявления:

Примечания: тот же может быть достигнуто с помощью простого для и/или во время цикла

string a = "ABCDEFGH"; 
a = new string(Enumerable.Range(0, a.Length).Select(i => (a[(i+1)%a.Length])).ToArray()); 
Смежные вопросы