切换要在外部使用的变量
本文关键字:变量 外部 | 更新日期: 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);
}
不能引用其封闭范围之外的变量。
任一:
- 将变量移动到更大的范围。这样做的不利之处在于,我们总是尽量缩小范围
- 将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;
}