繁体   English   中英

不错的简单ASP.NET MVC2 C#问题(切换语句)

[英]Nice Simple ASP.NET MVC2 C# Question (Switch Statement)

早上好,

我有以下代码行:

 var viewModel = new ClassifiedsBrowseViewModel
        {
            Category = categoryModel,
            Listings = categoryModel.Listings.OrderBy(c => c.Price).ToList()
        };

世界上一切都很好,并且此代码可以正常工作。 但是现在我想添加一个switch语句,该语句允许我更改订购商品的方式(在上面的代码中按价格订购)。

所以我显然只能在新模型减速中使用switch语句,因此我将switch语句放在例如:

  switch(searchCriteria)
            {
                case "Price":
                    break;
                case default:
                    break;
            }

所以我的问题是如何将两者链接在一起? BTW列表在ViewModel中声明为:

 public List<Listing> Listings { get; set; }

我以为我可以在Controller中声明一个Listings变量,然后在Switch中将该变量设置为categoryModel.Listings.OrderBy(c => c。 [Search Criteria] )。ToList(),然后简单地让Listings = Listings吗?

非常感谢,J

运用

使用Ribon方法:

 var viewModel = new ClassifiedsBrowseViewModel
        {
            Category = categoryModel,
            Listings = categoryModel.Listings.OrderBy(c =>
            {
                switch (searchCriteria)
                {
                    case "Price": return c.Price;
                    case "FuelType": return c.FuelType;
                    default: return c.Price;
                }
            }).ToList()
        };

我对Linq语句一无所知,但是您不能只做下面的事情吗?

var viewModel = new ClassifiedsBrowseViewModel
        {
            Category = categoryModel,
            Listings = categoryModel.Listings.OrderBy(c => {
                switch (searchCriteria) {
                    case "Price" : return c.Price; break;
                    default: return c; break;
                }
            }).ToList()
        };

您可以在switch语句中使用linq语句,例如

switch(searchCriteria)
            {
                case "Price":
                    viewModel.Listings = categoryModel.Listings.OrderBy(c => c.Price).ToList()
                    break;
                case default:
                    viewModel.Listings = categoryModel.Listings.OrderBy(c => c.SomeOtherField).ToList()
                    break;
            }

我会:

IEnumerable<Foo> listings = categoryModel.Listings;
switch(sortOrder) {
    case "x":
       listings = listings.OrderBy(l => l.Something);
       break;
    case "y":
       listings = listings.OrderBy(l => l.Whatever);
       break;
}

然后在模型创建中使用listings变量:

...
Listings = listings
...

(或listings.ToList())

IMO一个不错的,干净的和易读的解决方案是创建一个扩展方法,该方法接受IQueryable和一个表示各种排序选项的枚举。

public static IOrderedQueryable<Listing> WithListingOrder(this IQueryable<Listing> source, PriceOrderingOptions orderBy)
{
   switch (orderBy)
   {
      case ListingOrderingOptions.Price:
         return source.OrderBy(x => x.Price);
      ... // other enumerations
   }
}

我有一个通用的排序扩展方法(采用T,TKey),但是在您的情况下,由于您使用的是字符串(搜索条件),因此不能在此处使用通用。

但是我认为将排序选项表示为枚举应该可以防止“魔术字符串”。

并像这样使用它:

var searchCritera = ListingOrderingOptions.Price;

var viewModel = new ClassifiedsBrowseViewModel
        {
            Category = categoryModel,
            Listings = categoryModel.Listings.WithListingOrder(searchCriteria)
            }).ToList()
        };

这样做的主要好处是您可以将扩展开关后面的难看的开关隐藏起来 -目的是保持控制器清洁。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM