0

Здраствуйте! Возникла проблема с поиском с использованием LINQ в элементе управления dataGridView В него добавлены товары. товар описан как класс. Он реализуется вот так:

public class Product 
{
    public string Goods{ get; set;}
    public double Price {get; set;}
    public double Kcal {get; set;}
    public Product(string name, double price, double kcal)
    {
        Goods = name;
        Price = price;
        Kcal = kcal;
    }
}
public List<Product> Products;
public Form2()
{
    InitializeComponent();
    Products = new List<Product>{ new Product("blablabla1", 300.0, 3500.0), new Product("blablabla2", 123.0, 2000);
    dataGridView.DataSource = Products;
}
private void LINQSeachBtn_Click(object sender, EventArgs e)
{
    if(comboBox1.Text.ToString() == "Самый дёшевый товар")
    {
      var query = // как тут реализовать поиск самого дешевого товара который есть в гриде и скрыть все остальные?
    }
// Аналогично и с самым дорогим товаром 
}

Задача: В начале отображаються все товары которые есть(их название, цена, калорийность и так далее) нужно с помощью LINQ реализовать поиск самого дешевого товара которые инициализируются в списке таким вот образом как я описал в шаблоне кода

Буду очень благодарен! Самый полезный ответ отмечу галочкой :)

1 Answers1

0

Для того, чтобы скрывать элементы и при этом не терять данные, можно сделать несколько списков. Например, так:

List<Product> ProductsSource;
public List<Products> Products {get;set;}

Затем в инициализации:

Products = ProductsSource;
dataGridView.DataSource = Products;

А для поиска элемента можно написать LINQ-выражение. Видео по теме :

var query = ProductsSource.MinBy(p => p.Price);

Далее, чтобы отобразить только минимальный элемент, нужно присвоить результат в свойство Products. Для поиска максимума можно использовать функцию MaxBy().

B0lver
  • 56
  • Пишет что не содержит определения MinBy – NULL_PTR_T Nov 28 '22 at 09:39
  • @NULL_PTR_T, в таком случае, попробуйте отсортировать массив по возрастанию цены и взять первый элемент:

    Products = ProductsSource.OrderBy(item => item.Price); var min = Products.First(); Или

    – B0lver Nov 28 '22 at 19:55
  • @NULL_PTR_T, или воспользоваться сочетанием Where() и Min():

    Products = ProductsSource.Where(prod => prod.Price == ProductsSource.Min( item => item.Price)); Но вообще попробуйте разобраться, почему вы не можете использовать MinBy. Возможно, вы используете старую версию языка или не подключили какие-то библиотеки.

    – B0lver Nov 28 '22 at 20:03
  • А где логика вообще у С#. Я пишу такой же код для максимального элемента, а в итоге ничего не возвращается, хотя с минимальным элементом всё работает как надо. Я сортирую список по возрастанию и выбираю последний элемент последовательности то есть тот который самый большой – NULL_PTR_T Nov 29 '22 at 18:09
  • @NULL_PTR_T, лучше приложите код, как вы это делаете. Ничего не возвращается - это null? Попробуйте отладить, посмотреть, какие данные вы записываете, проверьте данные в списке. – B0lver Nov 29 '22 at 20:25