Как реализовать поиск по критерию с помощью LINQ

Здраствуйте! Занимаюсь разработкой одного симулятора в котором нужно реализовать поиск товаров по критериям используя LINQ(это обязательное условие что только и только через LINQ) Проблема заключается в следующем:

На форму Windows у меня добавлены следующие компоненты: 2 кнопки(Button) и 2 метки(Label). Кнопки отображают товар, а метки(лейблы) отображают его цену(цену товара). Помимо них еще добавлена кнопка поиска и comboBox откуда пользователь может выбрать подходящий для себя критерий поиска.

Задача заключается в скрытии всех кнопок изображающих товар если он не соответсвует критерию Среди критериев у меня имеются:

-Поиск самого дешевого товара в каталоге

-Поиск самого дорогого товара в каталоге

Например пользователь открывает comboBox и выбирает из предложеного списка критериев к примеру: Поиск самого дорогого товара в каталоге. Нужно чтобы програма скрыла все кнопки(товары) которые не соответсвуют данному критерию, а отобразила лишь только товар с самой большой ценой. Аналогично и для противоположного ему критерию

Я написал шаблон кода на языке С# и не знаю как дальше быть чтобы реализовать даную задачу

Код:

private void LINQSearchBtn_Click(object sender, EventArgs e)
{
     Button [] btn = {button1, button2}; // тут button1 - 1-ый товар а button2 - 2-ой товар 
     double []prices = {Convert.ToDouble(Price1.Text), Convert.ToDouble(Price2.Text)}; // массив цен 
     double minPrice = prices.Min();
     double maxPrice = prices.Max();
     var query_min = from pr in prices where pr.Equals(minPrice) select pr;
     var query_max = from pr in prices where pr.Equals(maxPrice) select pr;
     if(comboBox1.Text == "Самый дешевый товар в каталоге")
     {
         // Тут не знаю как провернуть отображение нужных кнопок и скрыть ненужные кнопки и лейблы
     }
     else if(comboBox1.Text == "Самый дорогой товар в каталоге")
     {
         // Тут то же самое что и в первом блоке if только уже поиск самого дорогого товара 
     }

}

Обработка того нажата ли кнопка работает поэтому тут проблема возникает только с поиском. Надеюсь на помощь энтузиастов :) :) :) Заранее спасибо! Отмечу самый подходящий ответ как тот что решил проблему


Ответы (1 шт):

Автор решения: B0lver

Здорово, что вы разобрались с работой кнопки и обработкой нажатия. Хотел сделать несколько дополнений и поправок к вашему коду, и возможно дать пару советов к будущим работам.

Во-первых, при работе с объектами, такими как товары, автомобили и другие сложные объекты, лучше всего будет сгруппировать все данные о них в один класс.

Например:

public class SaleItem
{
    public double Price {get;set;}
    public string Name {get;set;}
    //...// Другие свойства, которые характеризуют объект
}

Затем можно создать массив объектов, и провести поиск в нём:

// Такое создание объектов добавлено просто для примера,
// вы можете заполнять данные для объектов в процессе выполнения
var item1 = new SaleItem() 
{
    Name = "name1",
    Price = 120
}
var item2 = new SaleItem()
{
    Name = "name2",
    Price = 120
}
SaleItem[] Items = {item1, item2}

После этого можно воспользоваться LINQ и сразу найти объект с минимальной ценой. Для максимальной цены - аналогично:

var minPriceItem = Items.MinBy(item => item.Price);

Теперь перейдём к отображению кнопок. Очевидным, но не самым правильным решением, было бы добавить свойство типа Button к классу, и взаимодействовать с ним.

public class SaleItem
{
    public Button ItemButton {get;set;}
    //...// Другие свойства, которые характеризуют объект
}

И в программе после проверки условия делать примерно следующее

Items.ForEach(item => {item.ItemButton.IsVisible = false;});
minPriceItem.ItemButton.IsVisible = true;

Но я не советую вам так делать, это может работать, но смешивать данные и отображение таким образом - неправильно.

Лучшим решением было бы сделать динамический массив типа ObservableCollection и привязать его к списку, который отображался бы на странице. Всё это только звучит сложно.

Могу посоветовать вам посмотреть видео-уроки по WinForms, особенно про привязку данных. А также посмотреть документацию. Успехов!

→ Ссылка