1

目标

在 a 中声明一些变量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);
}

问题

有人有任何想法来解决我的问题吗?

4

5 回答 5

7

在 switch 中声明一些变量并在外部使用它。

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

你必须在语句之外声明你的变量switch,然后你就可以在外面使用它。

我看到您正在使用var(Implicitly typed variable) 并且您不能在语句之外声明它switch(因为需要分配),您应该看到:Declaring an implicitly typed variable inside conditional scope and using it outside and the埃里克·利珀特的回答

于 2013-07-29T14:12:27.027 回答
5

在 switch 块外部声明变量并为其赋值。也尽量不要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);
于 2013-07-29T14:18:04.867 回答
1

只需将变量的声明放在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);
}
于 2013-07-29T14:12:24.453 回答
0

您将需要在 case 语句之外声明变量OrganizedProductsList,因为它只具有 case 语句的范围。

注意:我不知道 Products.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;
    }
于 2013-07-29T14:24:07.110 回答
0

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

任何一个:

  1. 将变量移动到更广泛的范围。这样做的缺点是我们总是努力使范围尽可能窄。
  2. 将 switch 语句提取到一个函数中并让它返回值。

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

ProductList organizedProductsList(...)
{
    return productsList.OrderBy(...);
}

....

ComparisonViewModel comparisonViewModel =
    new ComparisonViewModel
    {
        Product = product,
        ProductList = organizedProductsList(...)
    };
于 2013-07-29T14:13:45.963 回答