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

Ich brauche den String s ein Feld nach links zu verschieben, so dass ich mit dem String am Ende: „BCDEFGHA“ Also dachte ich über die Zeichenfolge in einen char-Array zu ändern und meine Arbeit Weg von dort, aber ich bin nicht sicher, wie man das erfolgreich macht. Ich bin mir ziemlich sicher, dass ich eine for-Schleife brauche, aber ich brauche etwas Hilfe, um die Char-Sequenz um ein Feld nach links zu verschieben.Shifting einen String in C#

+0

erreicht werden, wie das Ergebnis aussieht? – spajce

+0

Sie sagten, Sie enden mit "BCDEFGHA". Erwartest du das nicht? Welches Ergebnis erwarten Sie bei der Eingabe "ABCDEFGH"? – zsong

+0

Entschuldigung, ich könnte es falsch phared haben. Ich erwarte das Ergebnis "BCDEFGHA", aber es ist nicht das, was meine aktuelle Ausgabe ist. – user2104751

Antwort

8

Wie wäre es damit?

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

Danke, das schien zu funktionieren, aber ich bin mir nicht 100% sicher, wie das eigentlich funktioniert. Wäre es nett zu erklären, warum es so ist? – user2104751

+0

Stellen Sie sich vor Sie haben diese Zeichenfolge "ABC". dieser Teil 't.Substring (1, t.Length - 1) 'wird' BC' ergeben, während dieses 't.Substring (0, 1)' 'A' zurückgibt. –

+2

Oh warte, ich kann es wissen. Die t.Substring (1, t.Length - 1) übersetzt in "BCDEFGH" und t.Substring (0, 1) übersetzt in "A", und durch Verkettung erhalten wir "BCDEFGHA"? – user2104751

7

Sie können dies versuchen:

s = s.Remove(0, 1) + s.Substring(0, 1); 

Als Erweiterung Methode:

public static class MyExtensions 
{ 
    public static string Shift(this string s, int count) 
    { 
     return s.Remove(0, count) + s.Substring(0, count); 
    } 
} 

Dann können Sie verwenden:

s = s.Shift(1); 
+0

+1, um es zu einer Erweiterung zu machen :) –

3

Persönlich dies ich tun würde:

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

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

Sorry, kann nicht +1 dafür, weil diese Antwort bereits verwendet wurde. –

2

Sie können die Vorteile aus der Tatsache ziehen, dass string ist IEnumerable<char>:

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

Die Klasse String geben Sie eine bessere Leistung

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

Der Algorithmus diese Art von Problem zu Verschiebung lösen n Positionen ist die Zeichenfolge duplizieren, miteinander verketten und die Teilzeichenfolge erhalten. (n < Länge (string))

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

wenn Sie n Position verschieben möchten, können Sie

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

+1 danke dieser Ansatz ist wirklich hilfreich –

1

tun Below Methoden, um die Zahl n nehmen, die erzählt, wie oft Sie wollen um die Saite zu verschieben/rotieren. Ich habe die MOD nach Länge der Zeichenfolge genommen, wenn die Anzahl größer als die Länge der Zeichenfolge ist.

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


    } 

/// Sie eine Verwendung in Überspringen machen können und Take Funktionen der String-Operationen

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

Sie auch, dass mit einer einfachen LINQ-Anweisung erreichen:

Hinweis: die gleiche kann mit einfachen für und/oder während Schleife

string a = "ABCDEFGH"; 
a = new string(Enumerable.Range(0, a.Length).Select(i => (a[(i+1)%a.Length])).ToArray());