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

时间:2010-11-13 12:29:22

标签: c# asp.net-mvc-2

早上好,

我有以下代码行:

 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 =&gt; c。 [Search Criteria] )。ToList( )然后简单地有Listings = Listings?

非常感谢, Ĵ

使用

使用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()
        };

4 个答案:

答案 0 :(得分:1)

我对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()
        };

答案 1 :(得分:1)

您可以在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;
            }

答案 2 :(得分:1)

我会:

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;
}

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

...
Listings = listings
...

(或listings.ToList())

答案 3 :(得分:1)

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()
        };

这里的主要好处是你的隐藏扩展后面的丑陋开关 - 这里的目标是保持你的控制器清洁。