Здравствуйте, <Аноним>, Вы писали:
А>Хочется понять, как без switch сделать фильтрацию массива с динамическим набором условий
Enumerable.Where подойдет?
... << RSDN@Home 1.2.0 alpha 5 rev. 99 on Windows 8 6.2.9200.0>>
Здравствуйте, Аноним, Вы писали:
А>Привет
А>Хочется понять, как без 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>, если ты за ними в базу данных лезешь.
Здравствуйте, 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>, если ты за ними в базу данных лезешь.
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, ionoy, Вы писали:
А>Одно дополнение к логике.
А>Как без создания массива из новых объектов через Enumerable.Select создать функцию, которая не просто фильтрует, а еще к примеру изменяет стоимость каждой машины?
А>Т.е. изначально стоимость машины храниться в евро, а юзер хочет видеть в долларах.
Так:
cars.Select(c => { c.Price = ConvertPrice(c.Price); return c; });
Здравствуйте, ionoy, Вы писали:
I>Здравствуйте, Аноним, Вы писали:
А>>Здравствуйте, ionoy, Вы писали:
А>>Одно дополнение к логике.
А>>Как без создания массива из новых объектов через Enumerable.Select создать функцию, которая не просто фильтрует, а еще к примеру изменяет стоимость каждой машины?
А>>Т.е. изначально стоимость машины храниться в евро, а юзер хочет видеть в долларах.
I>Так:
I>I>cars.Select(c => { c.Price = ConvertPrice(c.Price); return c; });
I>
Big thanks!