从if else语句转换为switch case

时间:2018-04-14 09:05:04

标签: c# asp.net webforms

我有以下if else语句来检查价格的值。但是,我只是好奇我怎样才能将它转换为switch语句。

if(sellingPrice <= costPrice)
{
    Response.Write("<script>alert('The value of the selling price must be higher than the cost price!','_self')</script>");
}
else if(sellingPrice == 0)
{
    Response.Write("<script>alert('The value of the selling price must not be equal to zero!','_self')</script>");
}
else if(costPrice == 0)
{
    Response.Write("<script>alert('The value of the cost price must not be equal to zero!','_self')</script>");
}
else
{
    con = new SqlConnection(@"Data Source = ARIES - PC\SQLEXPRESS; AttachDbFilename = D:\Visual Studio 2015 Web Forms\POS_with_Inventory\Database\Point_Of_Sales.mdf;Integrated Security = True");
    con.Open();
    cmd = new SqlCommand("addStocks", con);
    cmd.Parameters.AddWithValue("ProductID", productId);
    cmd.Parameters.AddWithValue("ProductName", itemName);
    cmd.Parameters.AddWithValue("ProductCategory", category);
    cmd.Parameters.AddWithValue("ProductDesc", description);
    cmd.Parameters.AddWithValue("ProductCostPrice", costPrice);
    cmd.Parameters.AddWithValue("ProductSellingPrice", sellingPrice);
    cmd.Parameters.AddWithValue("ProductQuantity", quantity);
    cmd.Parameters.AddWithValue("RemainingProduct", quantity);
    cmd.Parameters.AddWithValue("ProductPurchased", datePurchased);
    cmd.Parameters.AddWithValue("ProductStatus", status);
    cmd.ExecuteNonQuery();
    cmd.Dispose();
    con.Close();
}

1 个答案:

答案 0 :(得分:0)

您展示的案例是:

  • A和B之间的一个比较
  • 检查A是否为0
  • 检查B是否为0

这很明显超出了开关的范围。您需要将其归结为只检查一个值(A或B)与常量。

此规则因C#7.0而略有侵蚀,添加pattern matching用于切换。但我很确定您只能切换单个值的规则仍然适用。

编辑:实际上,通过模式匹配,它是可能的。您必须将A和B移动到单个类型(struct,tuple,anonymous类型)。但是一旦oyu这样做,when子句就可以让你把它拉下来(当a.SellPrice == a.BuyPrice时)。但这真的是一个值得努力的问题。

编辑2:让#s写一些关于我的想法的代码。我不确定这会编译,但它有一个坚实的案例。

switch(priceGroup){
  case prices p when p.sellingPrice <= p.costPrice:
    break;
  case prices p when p.sellingPrice == 0:
    break;
  case prices p when p.costPrice == 0:
    break;
}