Этот код не дает мне результатов, которых я ожидал бы.Петли с делегатами отсутствуют весь текст C#
После некоторых исследований я обнаружил, что с делегатами в цикле вы должны фиксировать значение счетчика - как видно из этого через inneri
и innerj
. Однако по какой-то причине с моей петлей for
с j ,
строка stringThisRoll
имеет только первые два числа рулона кости.
Я не могу понять, почему это происходит. В поле intThisRoll
указано число, которое соответствует числу костей, которые должны быть свернуты, но stringThisRoll
не имеет всего этого.
Я рассмотрел некоторые другие вопросы здесь, в stackoverflow, но никто, казалось, не прояснил это, просто необходимость захвата счетчика.
Благодаря
Вот мой код:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace Better_Betrayal_Dice_Roller
{
public partial class Form1 : Form
{
TextBox txtBox = new TextBox();
List<Button> buttons = new List<Button>();
List<Label> labels = new List<Label>();
public Form1()
{
int NumberOfOptions = 9;
/*Makes the controls*/
for (int i = 0; i < NumberOfOptions; i++)
{
Button tmpButton = new Button();
Label tmpLabel = new Label();
buttons.Add(tmpButton);
labels.Add(tmpLabel);
}
/*Add the controls to the form*/
for (int i = 0; i < NumberOfOptions; i++)
{
buttons[i].Visible = true;
labels[i].Visible = true;
buttons[i].Text = "Roll " + (i + 1).ToString();
labels[i].Text = "Please Roll";
buttons[i].Location = new Point(10, (30 * i) + 10);
labels[i].Location = new Point(100, (30 * i) + 15);
labels[i].Size = new Size(100, 20);
this.Controls.Add(buttons[i]);
this.Controls.Add(labels[i]);
}
/*delegates for the buttons*/
for (int i = 0; i < NumberOfOptions; i++)
{
int inneri = i;
int numberOfDice = inneri + 1;
buttons[i].Click += delegate(Object send, EventArgs e)
{
labels[inneri].Text = "";
string stringThisRoll = "";
int intThisRoll = 0;
var tempResults = diceResults(inneri+1);
for (int j = 0; j < tempResults.Count; j++)
{
int innerj = j;
intThisRoll += tempResults[innerj];
stringThisRoll += tempResults[innerj].ToString() + " ";
}
labels[inneri].Text = intThisRoll.ToString();
labels[inneri].Text += " Made of: " + stringThisRoll;
//MessageBox.Show(inneri.ToString());
//labels[inneri].Text += "Last one: " + tempResults[tempResults.Count-1].ToString();
};
}
InitializeComponent();
}
List<int> diceResults(int numDice)
{
Random rnd = new Random();
List<int> resultList = new List<int>();
int total = 0;
for (int i = 0; i < numDice; i++)
{
resultList.Add(rnd.Next(0, 3));
}
return resultList;
}
}
}
Вы пытались отладить его шаг за шагом? Обычно это проще, чем просто попытаться найти проблему, просто глядя на код. – Andrey
innerJ не требуется, потому что j не является * внешней переменной * анонимной функции. –
'Похоже, что это требует какой-то серьезной отладки' от' OP' – MethodMan