의견이 너무 많습니다.
// 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
을 사용하여 lazily 결과를 얻습니다.
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();
각 값에 대해, I는 승산기 어레이에서의 보수 곱해야한다.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());
끝나면 위의 코드로 끝납니다.
AHHHHH, Mathew에게 감사드립니다. –
나는 당신의 방법을 사용하여 약 28 개의 엔트리를 얻는다 : : S 귀하의 설명은 위대한 tho입니다 :) –
@JungleBoogie 좋아, 루프에서 두 번째 오류가 수정되었습니다. 희망은 당신에게 이해가 되네요! –