在C#中使用switch:如何完成我尝试编写的语句?

时间:2019-03-19 02:40:16

标签: c#

我正在创建一个根据销售额计算员工佣金的程序,已经计算出了佣金计算,但是在发生以下情况时,我仍然需要编写一个切换语句以返回“请重新输入销售额”将除数字以外的任何其他值输入到salesTextBox中。

string empTitle;
double salesAmount;
double commAmt;

empTitle = employeeTextBox.Text;
salesAmount = double.Parse(salesTextBox.Text);
bool AmountIsNumber = double.TryParse(salesTextBox.Text, out salesAmount);

switch (empTitle)
{
    case "PT1":
        commAmt = (salesAmount * .1);
        MessageBox.Show(" The commission is " + commAmt.ToString());
        break;

    case "PT2":
        commAmt = (salesAmount * .15);
        MessageBox.Show(" The commission is " + commAmt.ToString());
        break;

    case "S1":
        commAmt = (salesAmount * .2);
        MessageBox.Show(" The commission is " + commAmt.ToString());
        break;

    case "S2":
        commAmt = (salesAmount * .25);
        MessageBox.Show(" The commission is " + commAmt.ToString());
        break;

    default:
        MessageBox.Show(" Please re-enter job title. ");
        break;
}

employeeTextBox.Clear();
salesTextBox.Clear();

switch (!AmountIsNumber)
{
}

MessageBox.Show(" Please re-enter the sales amount. ");
return;

4 个答案:

答案 0 :(得分:0)

不推荐,但是如果您必须使用switch

switch(!AmountIsNumber)
{
    case true: 
        MessageBox.Show(" Please re-enter the sales amount. ");
        break;
    case false:
        // your logic...
        break;
}

答案 1 :(得分:0)

总结所有其他答案:

  1. 您不能仅在第一个AmountIsNumber语句中检查switch,因为它仅与empTitle有关,而不与salesAmount有关。

    li>
  2. bool的switch语句非常无用,因为它更容易编写

    if (condition)
        DoThis();
    else
        DoThat();
    

    然后

    switch (condition)
    {
        case true:
            DoThis();
            break;
        case false:
            DoThat();
            break;
    }
    

从您的代码开始,您可以这样重写它:

double salesAmount, commAmt;
if (double.TryParse(salesTextBox.Text, out salesAmount))
{
    var message = ;
    switch (employeeTextBox.Text)
    {
        case "PT1":
            commAmt = (salesAmount * .1);
            break;
        case "PT2":
            commAmt = (salesAmount * .15);
            break;
        case "S1":
            commAmt = (salesAmount * .2);
            break;
        case "S2":
            commAmt = (salesAmount * .25);
            break;
        default:
            MessageBox.Show("Please re-enter job title.")
            return;
    }

    MessageBox.Show($"The commission is {commAmt}");
    employeeTextBox.Clear();
    salesTextBox.Clear();
}
else
    MessageBox.Show("Please re-enter the sales amount.");

此外,如果需要更多代码审查,则可以使用another stackexchange site

建议1:

要保持文化中立,您需要将if (double.TryParse(salesTextBox.Text, out salesAmount))替换为:

using System.Globalization;

// ...

var stringValue = salesTextBox.Text.Replace(',', '.');
if (double.TryParse(stringValue, NumberStyles.Any, CultureInfo.InvariantCulture, out salesAmount))
{
    // now we can safely parse "3.14" and "3,14" to 3.14

建议2:

如果您的salesTextBox.Text仅包含预定义的值-使用ComboBox控件而不是TextBox可能会更容易:

// somewhere in designer or in the form/control constructor:
employeeComboBox.DropDownStyle = ComboBoxStyle.DropDownList;    
employeeComboBox.Items.AddRange(new object[] { "PT1", "PT2", "S1", "S2" });

// in your switch statement:
switch (employeeComboBox.SelectedItem)
{
    case "PT1":
        commAmt = (salesAmount * .1);
        break;
    case "PT2":
        commAmt = (salesAmount * .15);
        break;
    case "S1":
        commAmt = (salesAmount * .2);
        break;
    case "S2":
        commAmt = (salesAmount * .25);
        break;
    // now, we don't need the "default:" option here
}

答案 2 :(得分:0)

我已经对您的代码进行了一些重构。我想这就是你要写的。

if (decimal.TryParse(salesTextBox.Text, out decimal salesAmount))
{
    Dictionary<string, decimal> commissions = new Dictionary<string, decimal>()
    {
        { "PT1", 0.1m },
        { "PT2", 0.11m },
        { "S1", 0.2m },
        { "S2", 0.25m },
    };

    string empTitle = employeeTextBox.Text;
    if (commissions.ContainsKey(empTitle))
    {
        decimal commAmt = salesAmount * commissions[empTitle];
        MessageBox.Show($" The commission is {commAmt}");
        employeeTextBox.Clear();
        salesTextBox.Clear();
    }
    else
    {
        MessageBox.Show(" Please re-enter job title. ");
    }
}
else
{
    MessageBox.Show(" Please re-enter the sales amount. ");
}

请注意,在使用货币金额时,最好使用decimal(货币价值)而不是double(科学价值)。

答案 3 :(得分:0)

您的语法语句不明确! 您已经尝试从文本框中解析出文本,然后又要求尝试解析相同的文本,并要求它从第一条语句中取出结果,如果该语句不起作用,那么它肯定不会再次起作用。

salesAmount = double.Parse(salesTextBox.Text);
bool AmountIsNumber = double.TryParse(salesTextBox.Text, out salesAmount);

毫无疑问,这将是一个问题。 在尝试解析另一个值之前,最好为销售量分配一个已知值。

double salesAmount = -1;
double.TryParse(salesTextBox.Text, out salesAmount);
if (salesAmount != -1){
    //then ok its a number
}
else
{
    //its not a number
}