切换要在外部使用的变量

本文关键字:变量 外部 | 更新日期: 2023-09-27 18:25:17

目标

switch中声明某个变量并在外部使用它。

问题

我不知道语法。

我在想什么

为了解决我的问题,我想做这样的事情,但没有成功,因为这只是一种哲学:

public ActionResult Compare(int id, string orderBy)
{
    var productsList = Products.BuildIndividualProductComparisonList(id);
    var product = Products.BuildToCompare(id);

        switch (orderBy)
        {
            case "lowestToBiggest":
                var organizedProductsList = 
                    productsList.OrderBy(x => x.minProductPrice);
                break;
            case "biggestToLowest":
                var organizedProductsList = 
                    productsList.OrderBy(x => x.maxProductPrice);
                break;
            default:
                var organizedProductsList = 
                    productsList.OrderBy(x => x.minProductPrice);
                break;
        }
    ComparisonViewModel comparisonViewModel =
        new ComparisonViewModel
        {
            Product = product,
            ProductList = organizedProductsList
        };
    return View(comparisonViewModel);
}

聚光灯

这是我最初的C#代码,运行良好:

public ActionResult Compare(int id, string orderBy)
{
    var productsList = Products.BuildIndividualProductComparisonList(id);
    var product = Products.BuildToCompare(id);
    ComparisonViewModel comparisonViewModel =
        new ComparisonViewModel
        {
            Product = product,
            ProductList = productsList
        };
    return View(comparisonViewModel);
}

问题

有人想解决我的问题吗?

切换要在外部使用的变量

在开关中声明某个变量并在外部使用它。

您不能。范围内定义的变量只能在该范围内可见。

您必须在switch语句之外声明您的变量,然后才能在外部使用它。

我看到你正在使用var(隐式类型变量),并且你不能在switch语句之外声明它,(因为这需要赋值),你应该看到:在条件范围内声明隐式类型的变量并在外部使用它,以及Eric Lippert 的答案

在开关块外声明变量并为其赋值。此外,集合名称也尽量不要使用List后缀:

IEnumerable<Product> sortedProducts;
switch (orderBy)
{
    case "lowestToBiggest":
        sortedProducts = products.OrderBy(x => x.minProductPrice);
        break;
    case "biggestToLowest":
        sortedProducts = products.OrderBy(x => x.maxProductPrice);
        break;
    default:
        sortedProducts = products.OrderBy(x => x.minProductPrice);
        break;
}

实际上,您的代码可以简化为:

IEnumerable<Product> sortedProducts =
   products.OrderBy(p => orderBy == "biggestToLowest" ?
                         p.maxProductPrice : 
                         p.minProductPrice);

只需将变量的声明放在switch块之外。但是,您必须在声明中指定变量的类型,而不是使用var,因为无法推断该类型。

public ActionResult Compare(int id, string orderBy)
{
    var productsList = Products.BuildIndividualProductComparisonList(id);
    var product = Products.BuildToCompare(id);
    var organizedProductsList = null;

        switch (orderBy)
        {
            case "lowestToBiggest":
                organizedProductsList = 
                    productsList.OrderBy(x => x.minProductPrice);
                break;
            case "biggestToLowest":
                organizedProductsList = 
                    productsList.OrderBy(x => x.maxProductPrice);
                break;
            default:
                organizedProductsList = 
                    productsList.OrderBy(x => x.minProductPrice);
                break;
        }
    ComparisonViewModel comparisonViewModel =
        new ComparisonViewModel
        {
            Product = product,
            ProductList = organizedProductsList
        };
    return View(comparisonViewModel);
}

不能引用其封闭范围之外的变量。

任一:

  1. 将变量移动到更大的范围。这样做的不利之处在于,我们总是尽量缩小范围
  2. 将switch语句提取到函数中,并让它返回值

我认为,选择1是显而易见的。要扩展选项2,代码如下所示:

ProductList organizedProductsList(...)
{
    return productsList.OrderBy(...);
}
....
ComparisonViewModel comparisonViewModel =
    new ComparisonViewModel
    {
        Product = product,
        ProductList = organizedProductsList(...)
    };

您需要在case语句之外声明变量organizedProductsList,因为它只具有case语句的作用域。

注意:我不知道是什么产品。BuildIndividualProductComparisonList(id)返回,我想它是一个产品列表。

因此类似于:

IEnumerable<Products> organizedProductsList = null;
switch (orderBy)
    {
        case "lowestToBiggest":
            organizedProductsList = 
                productsList.OrderBy(x => x.minProductPrice);
            break;
        case "biggestToLowest":
            organizedProductsList = 
                productsList.OrderBy(x => x.maxProductPrice);
            break;
        default:
            organizedProductsList = 
                productsList.OrderBy(x => x.minProductPrice);
            break;
    }