尽管输入不同,但从foreach循环返回的值相同

时间:2018-04-25 01:16:41

标签: c#

在我的编程课程中,我们正在学习Arraylists和结构。我们得到了一个赋值,我们将在arraylist中存储结构的多个实例。 struct存储最大值和与该值对应的字母等级。例如,我创建一个名为F的结构。它的字母是F,它的最大值是299.假设我输入399进入程序。这应该返回C作为等级,但它返回F.我真的不确定是什么导致了这个问题。任何帮助将不胜感激。

namespace StructAssignment
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        ArrayList Grades = new ArrayList();

        public struct Grade
        {
             public char letter;
             public int maxPoints;
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            Grade A;
            A.letter = 'A';
            A.maxPoints = 299;
            Grades.Add(A);

            Grade B;
            B.letter = 'B';
            B.maxPoints = 349;
            Grades.Add(B);

            Grade C;
            C.letter = 'C';
            C.maxPoints = 399;
            Grades.Add(C);

            Grade D;
            D.letter = 'D';
            D.maxPoints = 449;
            Grades.Add(D);

            Grade F;
            F.letter = 'F';
            F.maxPoints = 500;
            Grades.Add(F);

        }

        private void button1_Click(object sender, EventArgs e)
        {
            string grade = string.Empty;

            if(int.TryParse(textBox1.Text, out int points))
            {
                if(points < 0 || points > 500)
                {
                    MessageBox.Show("Please enter a number greater than 0 and less than 500");
                }
                else
                {
                    foreach(Grade gr in Grades)
                    {
                        if(points < gr.maxPoints)
                        {
                            grade = gr.letter.ToString();
                        }
                    }

                    MessageBox.Show(grade);
                }
            }
            else
            {
                MessageBox.Show("Please enter a valid number!");
            }
        }
    }
}

2 个答案:

答案 0 :(得分:3)

我认为一旦条件为真,你需要打破循环。并且您应该使用<=条件来匹配用户输入的确切数字。

foreach(Grade gr in Grades)
{
   if(points <= gr.maxPoints)
   {
      grade = gr.letter.ToString();
      break;
   }
}
MessageBox.Show(grade); 

答案 1 :(得分:0)

我很惊讶399的输入正在返回F;它的编码方式我希望D.你应该检查小于或等于,而不仅仅是小于。