1

文字列を目的の長さに「拡張」しようとしています (つまり、「ABCDE」、目的の長さ 7、パディングが「--ABCDE」、「-A-BCDE」、「-AB-CDE」、.... ..、「ABCDE--」)。

次のコードを使用して「ABCDEFGH」を長さ 16 にパディングしようとすると、コードが永久に実行されます。

/// <summary>
    /// Pad a str to desired length
    /// </summary>
    /// <param name="s"></param>
    /// <param name="length"></param>
    /// <param name="pad"></param>
    /// <param name="Padded"></param>
    public static void PadToLength(string s, int length, char pad, ref List<string> Padded)
    {
        if (s.Length == length)
        {
            Padded.Add(s);
            return;
        }
        else if (s.Length > length)
        {
            return;
        }
        else
        {
            List<int> pos = GetExceptPos(s, pad.ToString());
            pos.Sort();

            int count = -1;
            foreach (int p in pos)
            {
                count++;

                // Pad left 
                string leftPadStr = s.Substring(0, p) + pad + s.Substring(p);
                PadToLength(leftPadStr, length, pad, ref Padded);

                // Pad right at the last pos
                if (count == pos.Count - 1)
                {
                    string rightPadStr = s + pad;
                    PadToLength(rightPadStr, length, pad, ref Padded);
                }
            }
        }
    }

        /// <summary>
    /// Find indexes for elements different from target str
    /// </summary>
    /// <param name="str"></param>
    /// <param name="excludeStr"></param>
    /// <returns></returns>
    private static List<int> GetExceptPos(string str, string excludeStr)
    {
        List<int> allIndexes = new List<int>();
        for (int i = 0; i < str.Length; i++)
        {
            allIndexes.Add(i);
        }

        return allIndexes.Except(str.IndexesOf(excludeStr)).ToList();
    }

任意の提案をいただければ幸いです。ありがとう。

4

3 に答える 3

2

あなたはやりたいだけではありませんか:yourstring. PadLeft(8, '-')またはPadRight

http://msdn.microsoft.com/en-us/library/system.string.padleft(v=vs.71).aspx

ループは必要ありません

于 2012-10-04T22:10:56.680 に答える
0

私はあなたのためにWindowsアプリケーションでそれを書きました。
わかりやすいようにコメントを入れました。
そうでない場合は私に聞いてください;)

private void button1_Click(object sender, EventArgs e)
{
    //Starting Values
    var paddingLength = 7;
    var paddingCharacter = '-';
    var value = "ABCDE";

    //Create starting string value
    var startValue = value.PadLeft(paddingLength, paddingCharacter);

    //Create Char Array of string
    var charArray = startValue.ToCharArray();

    //New List
    var values = new List<String>();

    //Shifter and StartingShifter
    Int32 shifter;
    Int32 startingShifter;
    shifter = startingShifter = (paddingLength - value.Length) - 1;

    //Max Length of the Char array
    var maxLength = charArray.Length-1;

    //Total loops the for loop need to do
    var totalLoops = value.Length * (paddingLength - value.Length)-1;

    //Loop
    for (int i = 0; i <= totalLoops; i++)
    {
        //Swap the Characters
        SwapChar(charArray, shifter, shifter + 1);

        //Add value into list
        values.Add(new String(charArray));

        //Go on shifting or go to next character
        if (shifter + 1 == maxLength)
        {
            //Change the Max
            maxLength--;

            //Next -
            shifter = startingShifter = startingShifter - 1;

            ////FailSafe
            //if (shifter < 0)
            //{
            //    break;
            //}
        }
        else
        {
            //Next Array Value
            shifter++;
        }
    }
    //Set value in textbox
    textBox1.Text = String.Join(Environment.NewLine, values.ToArray());
}

private static void SwapChar(Char[] array, int position1, int position2)
{
    //
    // Swaps elements in an array. Doesn't need to return a reference.
    //
    Char temp = array[position1]; // Copy the first position's element
    array[position1] = array[position2]; // Assign to the second element
    array[position2] = temp; // Assign to the first element
}
于 2012-10-04T23:24:40.000 に答える
0

上記の @VRC を実行するには、次のコードを使用します。

    static void Main(string[] args)
    {
        var z = GetPermutations("ABCDEFGH", '-', 16);

        foreach (string s in z)
            Console.WriteLine(s);

        Console.ReadKey();
    }

    private static List<string> GetPermutations(string originalString, char padChar, int length)
    {
        if (length <= originalString.Length)
            return null;

        var list = new List<string>();
        int originalLength = originalString.Length;
        int ndx = 0;
        string beginString = originalString.PadLeft(length, padChar);
        string endString = originalString.PadRight(length, padChar);
        int lenDifference = endString.Length - originalString.Length;

        list.Add(beginString);
        while (lenDifference > 0)
        {
            while (ndx < originalLength)
            {
                beginString = SwapCharacters(beginString, lenDifference + ndx - 1, lenDifference + ndx);
                list.Add(beginString);
                ndx++;
            }

            ndx = 0;
            lenDifference--;
        }

        return list;
    }

    private static string SwapCharacters(string value, int position1, int position2)
    {
        char[] array = value.ToCharArray();
        char temp = array[position1]; 
        array[position1] = array[position2];
        array[position2] = temp; 
        return new string(array);
    }

コードを使用するには、GetPermutations()関数を呼び出すだけです。元の文字列、「パディング」する文字、および全長を渡します。を返しますList<string>。リストを繰り返し処理して、すべての文字列を取得できます。

于 2012-10-04T22:37:54.540 に答える