我认为循环太多了。
// 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 上方的代码。