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

时间:2013-05-16 17:30:04

标签: c#

我正在努力实现一些开始让我烦恼的事情,我有一个用户定义的整数,它是使用文本框输入的。用户输入的数字必须是7位数,我将7个数字中的每一个添加到列表中。我想,从用户定义的数字的第一个数字开始乘以8到2。

例如,如果用户输入4565457,则第一个数字变为4 x 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);
                }
            } 
    }

4 个答案:

答案 0 :(得分:2)

我认为发生的事情是你的内部循环在外部循环中执行,它们应该像这样:

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添加一位数字。然后,最里面的循环使用integerList中的一位数循环8次。

下次外循环迭代时,将下一个数字添加到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。

答案 1 :(得分:2)

this

之类的内容
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循环的东西包裹成一个衬里。另一个好处是,在您请求实际值之前它也不会执行。

答案 2 :(得分:1)

在我看来,循环太多了。

// 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());

当你完成后,你最终得到了休息时间之前的代码。

答案 3 :(得分:0)

由于嵌套for循环,您获得的条目超过7个。尝试将内循环放在第一个循环之外。

for (int a = 0; a < textBox1.Text.Length; a++)
{
    ...
}

foreach (int item in integerList)
{
    ...               
}