0

我正在尝试实现一些开始让我烦恼的事情,我有一个用户定义的整数,它是使用文本框输入的。用户输入的数字必须是 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

4 回答 4

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

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

于 2013-05-16T17:33:21.630 回答
2

这样的事情怎么样

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

于 2013-05-16T17:40:00.277 回答
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());

完成后,您将得到 break 上方的代码。

于 2013-05-16T17:41:58.320 回答
0

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

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

foreach (int item in integerList)
{
    ...               
} 
于 2013-05-16T17:39:20.377 回答