循环向列表框中添加比预期更多的内容
本文关键字:列表 添加 循环 | 更新日期: 2023-09-27 18:14:02
我试图实现的东西是开始惹恼我,我有一个用户定义的整数,是使用文本框输入。用户输入的数字必须是7位数长,我将这7个数字中的每一个加到一个列表中。我想从用户定义的数字的第一个数字开始乘以8直到2。
例如,如果用户输入4565457,那么第一个数字变成4 × 8:
4 x 8
5 x 7
6 x 6
5 x 5
4 x 4
5 x 3
7 x 2
我已经尝试过了,但是我在列表框中得到的输出有多个数字,远远超过7个条目:
List<int> integerList = new List<int>();
for (int a = 0; a < textBox1.Text.Length; a++)
{
integerList.Add(int.Parse(textBox1.Text[a].ToString()));
foreach (int item in integerList)
{
for (int b = 8; b > 1; b--)
{
listBox1.Items.Add(item * b);
}
}
}
我认为你的内部循环是在外部循环中执行的,它们应该像这样并排在一起:
List<int> integerList = new List<int>();
for (int a = 0; a < textBox1.Text.Length; a++)
{
integerList.Add(int.Parse(textBox1.Text[a].ToString()));
}
foreach (int item in integerList)
{
for (int b = 8; b > 1; b--)
{
listBox1.Items.Add(item * b);
}
}
查看最外层的循环。第一次迭代,你会给integerList
加一个数字。然后最内层的循环循环8次,使用integerList
中的1位数字。
下一次外部循环迭代时,将下一位数字添加到integerList
,因此现在它有两位数字。然后我们进入内部循环,再次循环8次,但这次是在有两个项目的integerList
上。
等等
但是仍然有一个错误!(我一开始错过了这一点,因为我在OP中误读了你的规格)
每个输入数字只循环一次,每个循环做一次乘法。
所以我们真的需要像这样修改代码:
List<int> integerList = new List<int>();
for (int a = 0; a < textBox1.Text.Length; a++)
{
integerList.Add(int.Parse(textBox1.Text[a])); // Note: Didn't need the ToString()!
}
int b = 8; // Will be 8 for the first multiplication.
foreach (int item in integerList) // Loop once per input digit.
{
listBox1.Items.Add(item * b);
--b; // So now it will be correct for the next loop iteration.
}
现在每个输入数字只循环一次。b
从8开始,每次循环迭代递减1。
这样怎么样
YourText.Select((character, index) => character + "x" + (YourText.Length - index)));
现在,您已经将文本重新映射到索引器中。只要用if换行,在某个索引处停止。
这里所发生的一切是,我取给定的文本并告诉它映射每个character
,以便它是:
`character`
plus the multiplier symbol
plus the length of the original text minus the `index`
最后一部分是因为索引将是字符串的从0开始的索引,所以您似乎希望将其翻转。
所以,本质上,这只是将通常的for循环包装成一行。另一个好处是,它不会执行,直到您请求一个实际的值。
我觉得循环太多了。
// at this point, it's assumed that inputText characters are all digits.
// you should have code that confirms this (var shouldContinue = inputText.All(char.IsDigit);)
var inputText = "4565457";
var input = inputText.Select(c => c - 48); // quick and dirty "ToInt" per char
var multipliers = Enumerable.Range(2, inputText.Length).Reverse();
var multiplied = input.Zip(multipliers, (a, b) => a*b);
listBox1.Items.AddRange(multiplied.ToArray());
当你分解它时,它变得非常简单。
我需要每个字符数字的整数值。假设是ASCII,这只是从字符中减去48(您可以从asciitable.com直观地感受到这一点)。使用.Select
,我们得到结果的惰性求值。
var toInt = givenText.Select(digit => digit - 48);
我需要把2到8的值倒过来
// can really only be used once
var multipliers = new [] {8, 7, 6, 5, 4, 3, 2};
// can be used with any length string > 0
var multipliers = Enumerable.Range(2, givenText.Length).Reverse();
对于每个值,我需要将其乘以乘数数组中的补数。 Zip
是一种方法,它对数组(更常见的是IEnumerable
)项进行配对,一旦其中一个源耗尽就退出。它的函数返回你对它做的任何操作;在本例中,将它们相乘。
Func<int, int, int> multiply = (a,b) => a*b;
var multiplied = toInt.Zip(multipliers, multiply);
// ... and inlined.
var multiplied = toInt.Zip(multipliers, (a,b) => a*b);
我想把这些值添加到我的ListBox。上面的代码实际上还没有计算任何东西。当.ToArray()
被调用时,所有的工作都被执行。
//listBox1.Items.Clear() //maybe?
listBox1.Items.AddRange(multiplied.ToArray());
当你完成后,你结束的代码上面的break
由于嵌套的for
循环,您将获得超过7个条目。试着把内循环放在第一个循环的外面。
for (int a = 0; a < textBox1.Text.Length; a++)
{
...
}
foreach (int item in integerList)
{
...
}