13
  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;
  }

文字列を1スペース左にシフトする必要があるため、文字列「BCDEFGHA」になりますこの作品。forループが必要なのは確かですが、charシーケンスを1スペース左にシフトする方法について助けが必要です。

4

11 に答える 11

16

これはどう?

public static string ShiftString(string t)
{
    return t.Substring(1, t.Length - 1) + t.Substring(0, 1); 
} 
于 2013-02-24T15:52:13.760 に答える
12

あなたはこれを試すことができます:

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);
于 2013-02-24T15:54:44.023 に答える
9

シフトn位置に関するこの種の問題を解決するアルゴリズムは、文字列を複製し、連結して部分文字列を取得することです。( n < 長さ (文字列) )

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

n位置をシフトしたい場合は、次のことができます

var result = ss.Substring(n, s.length);
于 2013-02-24T16:29:32.847 に答える
3

個人的に私はこれをします:

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

    return t.Substring(1) + firstLetter;
}
于 2013-02-24T15:54:50.033 に答える
3

C# 8 以降では...

右に1回転...

t = myString[^1] + myString[..^1];

または、左に1回転...

t = myString[1..] + myString[0];

または、量だけ右に回転します...

t = myString[^amount..] + myString[..^amount];

または、量だけ左に回転します...

t = myString[amount..] + myString[..amount];
于 2020-01-09T00:26:35.583 に答える
2

あなたは次の事実を利用することができstringますIEnumerable<char>

public static string ShiftString(string t){
    return new String(t.Skip(1).Concat(t).Take(t.Length).ToArray());
}
于 2013-02-24T15:58:39.077 に答える
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();
}
于 2013-02-24T16:00:51.763 に答える
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();


    }

///文字列操作のSkip関数とTake関数を利用できます

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

    }
于 2013-09-15T18:40:01.433 に答える