使用整数范围的 Visual C# 切换命令 - 课程作业要求

Visual C# switch command using range of integers - course assignment requirement

首先,如果发布了两次,我深表歉意。我认为该网站可能已经打嗝了。

在我的 C# 课程中,我有一个显然不可能的临床试验药物应用要求。如果我对这部分作业的解释不正确(从讲义中逐字复制),请有人告诉我:

"MONTHS      NUMBER OF TREATMENTS (use a Switch command)

    1 -19        10 -30
    20 - 39      31 -60
    40 - 59      61 - 100
    60 - 79      101 - 130
    80 - 99      131 - 180

例如:

如果随机选择的月数是从 20 到 39 - 治疗次数将是从 31 到 60 的随机数。如果月数是 82 - 治疗次数是从 131 到 180。 “

患者可用于试验的月数直接输入到文本框中;我的代码提供了患者参与临床试验的随机实际月份。我已经知道范围不能用于开关命令。由于该讲师还教授 Visual Basic,它显然支持切换命令中的范围,因此她可能将两者搞混了(遗憾的是,这种情况发生的频率惊人)。无论如何,我读过的所有内容都表明这对于开关盒来说是完全不可能的。

我不知道如何在没有 if/else 树而不是开关的情况下完成此操作。谁能给我任何想法?请不要使用正则表达式或 LINQ。我们不涵盖任何一个。

这是我的所有代码。这里的东西有效; file read/write 还没有实现,但我已经理解了那部分。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;

namespace NallyKProgram3ClinicalTrials
{
    public partial class NallyKClinicalTrialsForm : Form
    {
        public NallyKClinicalTrialsForm()
        {           InitializeComponent();      }

        private StreamWriter outputFile;
        private StreamReader inputFile;

        int numberOfMonthsInTrialRangeInteger;
        int numberAssignedToPatientInteger;
        int numberOfMonthsInTrialInteger;
        int numberOfTreatmentPlanInteger;
        int numberOfTreatmentsInteger;

        // const string CASE_STRING; this attempt didn't work

        Random rndNumber = new Random();

        Boolean duplicateNameBoolean;

        private void NallyKClinicalTrialsForm_Load(object sender, EventArgs e)
        {

            reportLabel.ResetText();
            removePatientButton.Enabled = false;
            writeFileButton.Enabled = false;

        }

        private void addPatientButton_Click(object sender, EventArgs e)
        {

            if (patientNameTextBox.Text.Trim() != string.Empty)
            {

                checkForDuplicateNames();

                generatePatientNumber(rndNumber);

                if (duplicateNameBoolean == false)
                {

                    if (numberOfMonthsTextBox.Text.Trim() != string.Empty)
                    {

                        if (int.TryParse(numberOfMonthsTextBox.Text.Trim(), out numberOfMonthsInTrialRangeInteger))
                        {

                            if (numberOfMonthsInTrialRangeInteger < 1 || numberOfMonthsInTrialRangeInteger > 99)
                            {

                                errorProvider1.SetError(numberOfMonthsTextBox, "The number of months available for participation in this trial must not be less than 1 or greater than 99.");
                                numberOfMonthsTextBox.Focus();
                                numberOfMonthsTextBox.SelectAll();

                            }

                            else
                            {

                                generateNumberOfMonthsInTrial(rndNumber);
                                generateTreatmentPlan(rndNumber);
                                // determineCaseString(); NOPE!
                                // determineNumberOfTreatments(rndNumber); TO DO
                                addToListBox();
                                addToNamesListBox();
                                readFileButton.Enabled = false;
                                removePatientButton.Enabled = true;
                                writeFileButton.Enabled = true;

                            }

                        }

                        else
                        {

                            errorProvider1.SetError(numberOfMonthsTextBox, "Please enter a number.");
                            numberOfMonthsTextBox.Focus();
                            numberOfMonthsTextBox.SelectAll();

                        }

                    }

                    else
                    {

                        numberOfMonthsTextBox.Text = "          ";
                        errorProvider1.SetError(numberOfMonthsTextBox, "You must enter a number of months.");
                        numberOfMonthsTextBox.Focus();
                        numberOfMonthsTextBox.SelectAll();

                    }

                }

                else
                {

                    errorProvider1.SetError(namesListBox, patientNameTextBox.Text + " is a duplicate name. Please enter a different name.");
                    patientNameTextBox.Focus();
                    patientNameTextBox.SelectAll();

                }

            }

            else
            {

                patientNameTextBox.Text = "          ";
                errorProvider1.SetError(patientNameTextBox, "You must enter a patient name.");
                patientNameTextBox.Focus();
                patientNameTextBox.SelectAll();

            }


        }

        private void checkForDuplicateNames()
        {

            int indexInteger = 0;
            duplicateNameBoolean = false;

            while (indexInteger < namesListBox.Items.Count)
            {

                if (patientNameTextBox.Text.ToLower().Trim() ==
                    namesListBox.Items[indexInteger].ToString().ToLower())
                {

                    duplicateNameBoolean = true;

                    indexInteger = namesListBox.Items.Count;

                }

                indexInteger++;

            }


        }

        private Random generatePatientNumber(Random rndNumber)
        {

            numberAssignedToPatientInteger = rndNumber.Next(1000, 9999);
            return rndNumber;

        }

        private Random generateNumberOfMonthsInTrial(Random rndNumber)
        {

            numberOfMonthsInTrialInteger = rndNumber.Next(1, numberOfMonthsInTrialRangeInteger);
            return rndNumber;

        }

        private Random generateTreatmentPlan(Random rndNumber)
        {

            numberOfTreatmentPlanInteger = rndNumber.Next(1, 5);
            return rndNumber;

        }

        //private void determineCaseString() NOPE, NOPE, NOPE
        //{

        //  if ((numberOfTreatmentPlanInteger >= 1) && (numberOfTreatmentPlanInteger < 20)) CASE_STRING = "a"; // clever, but error!
        //  if ((numberOfTreatmentPlanInteger >= 20) && (numberOfTreatmentPlanInteger < 40)) CASE_STRING = "b";
        //  if ((numberOfTreatmentPlanInteger >= 41) && (numberOfTreatmentPlanInteger < 60)) CASE_STRING = "c";
        //  if ((numberOfTreatmentPlanInteger >= 60) && (numberOfTreatmentPlanInteger < 80)) CASE_STRING = "d";
        //  if ((numberOfTreatmentPlanInteger >= 80) && (numberOfTreatmentPlanInteger < 100)) CASE_STRING = "e";

        //}

        //private Random determineNumberOfTreatments(Random rndNumber)
        //{

        //  numberOfTreatmentsInteger = rndNumber.Next(10, CASE_STRING); 

        //}

        private void addToListBox()
        {

            patientInformationListBox.Items.Insert(0, numberAssignedToPatientInteger.ToString() + "," + numberOfTreatmentPlanInteger + "," + numberOfMonthsInTrialInteger + "," + Environment.NewLine); // number of treatments goes after the final comma

        }

        private void addToNamesListBox()
        {

            namesListBox.Items.Insert(0, patientNameTextBox.Text.Trim());

        }

        private void exitButton_Click(object sender, EventArgs e)
        {

            this.Close();

        }

        private void removePatientButton_Click(object sender, EventArgs e)
        {

            if (patientInformationListBox.SelectedIndex > -1)
                patientInformationListBox.Items.RemoveAt(patientInformationListBox.SelectedIndex);

            else MessageBox.Show("You must select an entry you wish to remove from the list.", "SELECT AN ITEM TO REMOVE", MessageBoxButtons.OK, MessageBoxIcon.Information);

        }

        private void patientNameTextBox_TextChanged(object sender, EventArgs e)
        {

            errorProvider1.SetError(patientNameTextBox, "");
            errorProvider1.SetError(patientInformationListBox, "");

        }

        private void numberOfMonthsTextBox_TextChanged(object sender, EventArgs e)
        {

            errorProvider1.SetError(numberOfMonthsTextBox, "");

        }

    }

}

如果你必须使用开关,你可以将你的月份除以 20,然后再做一个开关。像这样:

int monthValue = numberOfTreatmentPlanInteger / 20;
switch (monthValue)
{
   case 0:
      // between 10 and 30 treatments
      break;
   case 1: 
      // between 31 and 60 treatments
      break;
   case 2:
      // between 61 and 100 treatments
      break;
   // and so on
}

你说得对,C# 不允许你在 switch 语句中使用范围。事实上,C# 只允许你写一个 case X:,其中 X 是一个单一的常量文字值。

但是,C# 确实允许您从一种情况跳转到另一种情况,因此允许您列出所有可以编写一个代码体来执行的情况。

因此,你可以这样写代码:

switch (months)
{
    case 1:
    case 2:
    case 3:
    ...
    case 19:
        treatments = r.Next(10, 31);
        break;
    case 20:
    case 21:
    case 22:
    ...
    case 39:
        treatments = r.Next(30, 61);
        break;
    case 40:
        ...

现在,这是你能做的最好的了吗?

没有。您可以在此处注意到范围内的模式。每个范围从 X 到 X+19,其中 X 是可以被 20 整除的数字,因此您可以使用整数除法将向下截断的事实:

int monthsSection = months / 20; // 0-19 --> 0, 20-39 --> 1, etc.
switch (monthsSection)
{
    case 0: // 0-19
        treatments = r.Next(10, 31);
        break;
    case 1: // 20-39
        treatments = r.Next(30, 61);
        break;
    case 2: // 40-59
    ...

是的,这也包括 0。如果这是一个问题,那么我会简单地在前面添加一个特定的 if 语句来过滤掉它。