2013-05-16 2 views
0

Я пытаюсь достичь чего-то, что начинает меня раздражать, у меня есть определенное пользователем число, которое вводится с помощью текстового поля. Номер, который вводит пользователь, должен быть 7 цифр, я добавляю каждый из 7 номеров в список. Я хочу, чтобы, начиная с первой цифры заданного пользователем числа умножить на 8 до 2.цикл, добавляющий больше к списку, чем ожидалось

Например, если пользователь вводит 4565457, то первое число становится 4 х 8:

4 x 8 
5 x 7 
6 x 6 
5 x 5 
4 x 4 
5 x 3 
7 x 2 

У меня есть попытался это, но выход я получаю в моем ListBox имеет несколько номеров, много больше, чем 7 entrys:

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); 
       } 
      } 
    } 

ответ

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 для каждой итерации цикла.

+0

AHHHHH, спасибо Мэтью. –

+0

Я все еще получаю около 28 записей, но используя ваш метод ...: S Ваше объяснение великолепие :) –

+1

@JungleBoogie Хорошо, я исправил вторую ошибку в циклах. Надеюсь, это имеет смысл для вас! –

0

Вы получаете более 7 записей из-за вложенного цикла for. Попробуйте поместить внутренний цикл за пределы первого цикла.

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

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

Подобный ответ был отправлен '@Matthew Watson'. – Veer

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 строка, так что вам кажется, что это перевернуло.

Итак, в сущности, это просто обертывание того, что, как правило, должно быть для петли в один лайнер. Другим преимуществом является то, что он также не будет выполняться до тех пор, пока вы не запросите фактическое значение.

+0

Я думаю, что он новый для C#, и это будет просто страшно. ;) Но это, наверное, то, что я сделал бы. –

+0

Возможно, но это еще более простой способ справиться с этим IMO –

+0

Да, я полностью согласен - но я знаю, что из его сообщений он просто изучает C# и петли на данный момент, так что это действительно хорошее решение, и это стоит OP зная, что такие вещи существуют ... В данный момент он не научит его. –

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

Когда вы закончите, вы получите код выше перерыва.

Смежные вопросы