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 回答