C# 如何";“成长”;达到所需长度的字符串
我正在尝试将字符串“增长”到所需的长度(即“ABCDE”,在填充变成“-ABCDE”、“-a-BCDE”、“-AB-CDE”、…“ABCDE-”)后,所需的长度7) 当我试图使用下面的代码将“ABCDEFGH”填充到长度16时,代码将永远运行C# 如何";“成长”;达到所需长度的字符串,c#,C#,我正在尝试将字符串“增长”到所需的长度(即“ABCDE”,在填充变成“-ABCDE”、“-a-BCDE”、“-AB-CDE”、…“ABCDE-”)后,所需的长度7) 当我试图使用下面的代码将“ABCDEFGH”填充到长度16时,代码将永远运行 /// <summary> /// Pad a str to desired length /// </summary> /// <param name="s"></param>
/// <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();
}
//
///将str焊到所需的长度
///
///
///
///
///
公共静态void PadToLength(字符串s、整数长度、字符填充、填充参考列表)
{
如果(s.Length==长度)
{
填充。添加(s);
返回;
}
否则,如果(s.长度>长度)
{
返回;
}
其他的
{
List pos=GetExceptPos(s,pad.ToString());
排序位置();
整数计数=-1;
foreach(位置中的int p)
{
计数++;
//左键
字符串leftPadStr=s.Substring(0,p)+pad+s.Substring(p);
焊盘长度(leftPadStr,长度,焊盘,参考填充);
//在最后一个位置右移
如果(计数==位置计数-1)
{
字符串rightPadStr=s+pad;
焊盘长度(右焊盘长度、焊盘长度、参考焊盘长度);
}
}
}
}
///
///查找与目标str不同的元素的索引
///
///
///
///
私有静态列表GetExceptPos(字符串str、字符串excludeStr)
{
列表所有索引=新列表();
对于(int i=0;i
如有任何建议,将不胜感激。谢谢。难道你不想做:
你的字符串。左焊盘(8,“-”)
或右焊盘
循环不是必需的要完成@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);
}
static void Main(字符串[]args)
{
var z=GetPermutations(“ABCDEFGH”,“-”,16);
foreach(z中的字符串s)
控制台。写入线(s);
Console.ReadKey();
}
私有静态列表GetPermutations(字符串originalString、char padChar、int length)
{
如果(长度为0)
{
while(ndx
要使用代码,只需调用
GetPermutations()
函数。将原始字符串、字符传递给“pad”和总长度。它将返回一个列表
。您可以遍历列表以获取所有字符串。我在windows应用程序中为您编写了它我已经发表了评论,这样就清楚了
如果没有,那么问我;)
private void按钮1\u单击(对象发送者,事件参数e)
{
//起始值
var paddingLength=7;
变量paddingCharacter='-';
var value=“ABCDE”;
//创建起始字符串值
var startValue=value.PadLeft(paddingLength,paddingCharacter);
//创建字符串的字符数组
var charArray=startValue.ToCharArray();
//新名单
var值=新列表();
//换档杆和起动换档杆
Int32移位器;
Int32启动移位器;
shifter=startingShifter=(paddingLength-value.Length)-1;
//字符数组的最大长度
var maxLength=charArray.Length-1;
//循环需要执行的循环总数
var totaloops=value.Length*(paddingLength-value.Length)-1;
//环路
对于(int i=0;i)这并不是在填充字符串-看起来您希望使用连字符和一组有序的字符来完成长度为N的所有排列?代码将永远运行-请使用逐步执行来找出代码的哪一部分导致无限循环/递归。在这一点上观察变量值可能有助于确定d问题的实际原因也是如此。@RJLohan是正确的。你想做什么?填充意味着只添加一个“填充符”为了使字符串的长度相等,字符串末尾的字符。你似乎在寻找所有可能的组合。让我把这个弄对。你想从左向右移动。就像ABC一样,然后pad是6。然后你会得到以下结果:--ABC,--a-BC,--AB-C,--ABC-,-a-BC-,-AB-C-,-ABC-,a-B-C--,AB-C--,ABC--。这是对的吗?@VRC有点对。但是我想要所有可能的插入,比如A-B-C--,A-B-C等等,它们可以解决填充问题,但不是实际的问题,实际上不是关于填充的。
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
}