Хороший простой ASP.NET MVC2 C # вопрос (Switch Statement) - PullRequest
2 голосов
/ 13 ноября 2010

Доброе утро,

У меня есть следующая строка кода:

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

В мире все хорошо, и этот код работает нормально. Но теперь я хотел бы добавить оператор switch, который позволяет мне изменять то, по чему я упорядочиваю списки (в приведенном выше коде это упорядочено по цене).

Так что я, очевидно, не могу не заявить о переключении в рамках замедления новой модели, поэтому я буду помещать оператор переключения выше, например:

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

Итак, мой вопрос, как мне связать их? Кстати, листинг объявлен в ViewModel как:

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

Я подумал, что мог бы объявить переменную List в контроллере, а затем установить эту переменную в Switch на categoryModel.Listings.OrderBy (c => c. [Критерии поиска] ). ToList () и тогда просто есть листинги = листинги?

Большое спасибо, J

Использование

Используя метод Рибона:

 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 ]

1 голос
/ 13 ноября 2010

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

IУ меня есть общий метод расширения порядка (принимая T, TKey), но в вашем случае, так как вы работаете со строкой (критерии поиска), здесь нельзя использовать обобщенные значения.

Но я думаю, что выражение вариантов заказа в видеПеречисление должно предотвращать «магические строки».

И использовать это так:

var searchCritera = ListingOrderingOptions.Price;

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

Основное преимущество здесь - это сокрытие уродливого переключателя за расширением -цель здесь - сохранить ваш контроллер в чистоте.

1 голос
/ 13 ноября 2010

Вы можете использовать оператор linq в своем выражении switch, например

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;
            }
1 голос
/ 13 ноября 2010

Я бы имел:

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
...

(или lists.ToList ())

1 голос
/ 13 ноября 2010

Я ничего не знаю о заявлениях 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()
        };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...