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