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

私は左に文字列s 1つのスペースをシフトする必要があるので、私は、文字列で終わる:「BCDEFGHAは」 は、だから私はchar型の配列に文字列を変更することについて考えて、私の仕事そこからの道ですが、この仕事をどのようにして成功裏に成し遂げるかはわかりません。私はかなりforループが必要だと確信していますが、私はどのように左にcharシーケンスの1つのスペースをシフトするにはいくつかの助けが必要です。C#で文字列をシフト

+0

結果はどのように見えますか? – spajce

+0

あなたは "BCDEFGHA"で終わると言った。あなたが期待していることではありませんか?あなたが入力 "ABCDEFGH"を与えられたら、どんな結果が期待されますか? – zsong

+0

申し訳ありませんが、私は間違ってそれをphareことがあります。私は結果 "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。この1つの 't.Substring(0、1)'は 'A'を返しますが、' BC'を返します。 –

+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

個人的に私はこれを行うと思いますが。

あなたは stringIEnumerable<char>であるという事実を利用することができます
public static string ShiftString(string t){ 
    string firstLetter = t.Substring(0, 1); 

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

申し訳ありません。その答えはすでに使用されているため、+1できません。 –

2

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ポジションは文字列を複製し、一緒に連結して部分文字列を取得します。 (nは<長さ(文字列)

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

あなたはN位置を移動したい場合は、方法下記

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

+1このアプローチは本当に役に立ちます –

1

を行うことができますあなたが望む何回告げる数nを取ります文字列をシフト/回転させます。数値が文字列の長さよりも大きい場合、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(); 


    } 

///あなたは、単純なLINQ文を使用してそれを達成することができますスキップを利用すると、文字列操作

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

の機能を実行できます。

注:同じforループとwhileループのどちらでも簡単に実現できます。

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