循环向列表框中添加比预期更多的内容

本文关键字:列表 添加 循环 | 更新日期: 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)
{
    ...               
}