Динамический фильтр для IEnumerable<customClass>
От: Аноним  
Дата: 11.06.13 11:52
Оценка:
Привет

Хочется понять, как без switch сделать фильтрацию массива с динамическим набором условий

Пример.
Есть класс Car с набором свойств: СтранаПр-ва, год изготовления, Стоимость
Есть класс AutoPark который имеет у себя IEnumerable из Car.
Внутри класса есть функции, каждая из которых по набору условий, принимаемых на вход условий должна вернуть отфильтрованный массив.

т.е. чтобы можно было сначала увидеть все машины, потом все немецкие машины с годом пр-ва старше 2005, а потом немецкие машины старше 2005 и стоимостью между 10000 и 25000 евро

Как такое проще ссделать?
Re: Динамический фильтр для IEnumerable<customClass>
От: AndrewVK Россия http://blogs.rsdn.org/avk
Дата: 11.06.13 12:34
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Хочется понять, как без switch сделать фильтрацию массива с динамическим набором условий


Enumerable.Where подойдет?
... << RSDN@Home 1.2.0 alpha 5 rev. 99 on Windows 8 6.2.9200.0>>
AVK Blog
Re: Динамический фильтр для IEnumerable<customClass>
От: ionoy Эстония www.ammyui.com
Дата: 11.06.13 12:38
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Привет

А>Хочется понять, как без switch сделать фильтрацию массива с динамическим набором условий

А>Пример.

А>Есть класс Car с набором свойств: СтранаПр-ва, год изготовления, Стоимость
А>Есть класс AutoPark который имеет у себя IEnumerable из Car.
А>Внутри класса есть функции, каждая из которых по набору условий, принимаемых на вход условий должна вернуть отфильтрованный массив.

А>т.е. чтобы можно было сначала увидеть все машины, потом все немецкие машины с годом пр-ва старше 2005, а потом немецкие машины старше 2005 и стоимостью между 10000 и 25000 евро


А>Как такое проще ссделать?


Если я правильно понимаю задачу, то в лоб решается так:

class AutoPark
{
  public IEnumerable<Car> Cars { get { ... } }
  
  public IEnumerable<Car> Filter(int? countryCode, int? yearMin, int? yearMax, int? priceMin, int? priceMax)
  {
     var cars = Cars;
     
     if(countryCode != null)
         cars = cars.Where(c => c.CountryCode == countryCode);
     
     if(yearMin != null)
         cars = cars.Where(c => c.Year >= yearMin);

     if(yearMax != null)
         cars = cars.Where(c => c.Year <= yearMax);

     .... //то же самое с ценой
  }
}


Если же условия, действительно, динамичные, т.е. извне приходит как название поля, так и допустимые значения, то тут нужно уже строить Expression. Но это уже для IQueryable<Cars>, если ты за ними в базу данных лезешь.
www.livexaml.com
www.ammyui.com
www.nemerleweb.com
Re[2]: Динамический фильтр для IEnumerable<customClass>
От: Аноним  
Дата: 11.06.13 12:45
Оценка:
Здравствуйте, ionoy, Вы писали:

Да, всё правильно поняли.
Спасибо
Re[2]: Динамический фильтр для IEnumerable<customClass>
От: Аноним  
Дата: 11.06.13 13:05
Оценка:
Здравствуйте, ionoy, Вы писали:

Одно дополнение к логике.
Как без создания массива из новых объектов через Enumerable.Select создать функцию, которая не просто фильтрует, а еще к примеру изменяет стоимость каждой машины?
Т.е. изначально стоимость машины храниться в евро, а юзер хочет видеть в долларах.



А>>Привет

А>>Хочется понять, как без switch сделать фильтрацию массива с динамическим набором условий

А>>Пример.

А>>Есть класс Car с набором свойств: СтранаПр-ва, год изготовления, Стоимость
А>>Есть класс AutoPark который имеет у себя IEnumerable из Car.
А>>Внутри класса есть функции, каждая из которых по набору условий, принимаемых на вход условий должна вернуть отфильтрованный массив.

А>>т.е. чтобы можно было сначала увидеть все машины, потом все немецкие машины с годом пр-ва старше 2005, а потом немецкие машины старше 2005 и стоимостью между 10000 и 25000 евро


А>>Как такое проще ссделать?


I>Если я правильно понимаю задачу, то в лоб решается так:


I>
I>class AutoPark
I>{
I>  public IEnumerable<Car> Cars { get { ... } }
  
I>  public IEnumerable<Car> Filter(int? countryCode, int? yearMin, int? yearMax, int? priceMin, int? priceMax)
I>  {
I>     var cars = Cars;
     
I>     if(countryCode != null)
I>         cars = cars.Where(c => c.CountryCode == countryCode);
     
I>     if(yearMin != null)
I>         cars = cars.Where(c => c.Year >= yearMin);

I>     if(yearMax != null)
I>         cars = cars.Where(c => c.Year <= yearMax);

I>     .... //то же самое с ценой
I>  }
I>}
I>


I>Если же условия, действительно, динамичные, т.е. извне приходит как название поля, так и допустимые значения, то тут нужно уже строить Expression. Но это уже для IQueryable<Cars>, если ты за ними в базу данных лезешь.
Re[3]: Динамический фильтр для IEnumerable<customClass>
От: ionoy Эстония www.ammyui.com
Дата: 11.06.13 14:04
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, ionoy, Вы писали:


А>Одно дополнение к логике.

А>Как без создания массива из новых объектов через Enumerable.Select создать функцию, которая не просто фильтрует, а еще к примеру изменяет стоимость каждой машины?
А>Т.е. изначально стоимость машины храниться в евро, а юзер хочет видеть в долларах.

Так:

cars.Select(c => { c.Price = ConvertPrice(c.Price); return c; });
www.livexaml.com
www.ammyui.com
www.nemerleweb.com
Re[4]: Динамический фильтр для IEnumerable<customClass>
От: Аноним  
Дата: 13.06.13 06:50
Оценка:
Здравствуйте, ionoy, Вы писали:

I>Здравствуйте, Аноним, Вы писали:


А>>Здравствуйте, ionoy, Вы писали:


А>>Одно дополнение к логике.

А>>Как без создания массива из новых объектов через Enumerable.Select создать функцию, которая не просто фильтрует, а еще к примеру изменяет стоимость каждой машины?
А>>Т.е. изначально стоимость машины храниться в евро, а юзер хочет видеть в долларах.

I>Так:


I>
I>cars.Select(c => { c.Price = ConvertPrice(c.Price); return c; });
I>


Big thanks!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.