Фильтрация списка с помощью linq

#c# #linq #generic-list

#c# #linq #общий список

Вопрос:

Будучи новичком в linq, у меня возникли проблемы при попытке применить фильтр к объекту списка. Это то, что у меня есть до сих пор

 var filter = productList.GroupBy(a => a.Product.FamilySku).Select(grp => grp.OrderByDescending(a => a.Product.FamilySku).First());
  

Это работает, за исключением того, что я не хочу применять фильтр, если a.Product.IsFamily != true

Я хочу добавить предложение except:

 Except(a.Product.IsFamily != true)
  

Итак, в псевдокоде я хочу сгруппировать по всему продукту.FamilySku, но не группируйте их, если продукт.IsFamily != true.

Спасибо за помощь

Ответ №1:

Другие ответы работают, если вы хотите полностью исключить продукты, в которых IsFamily равно false . Но если вы хотите, чтобы они были в отфильтрованном списке, но не сгруппированы, тогда вы могли бы Concat() их в конце следующим образом:

 var filter = productList.Where(p => p.Product.IsFamily)
                        .GroupBy(p => p.Product.FamilySku)
                        .Select(grp => grp.OrderByDescending(p => p.Product.FamilySku).First())
                        .Concat(productList.Where(p => !p.Product.IsFamily));
  

Может быть лучший способ сделать это, если вы не хотите менять их порядок.

Ответ №2:

Просто поместите Where() фильтр перед группировкой:

 var filter = productList.Where(p => p.Product.IsFamily)
                        .GroupBy(a => a.Product.FamilySku)
                        .Select(grp => grp.OrderByDescending(a => a.Product.FamilySku).First());
  

Ответ №3:

Похоже, вам просто нужно использовать метод Where():

 var filter = productList
                .Where(a => a.Product.IsFamily)
                .GroupBy(a => a.Product.FamilySku)
                .Select(grp => grp.OrderByDescending(a => a.Product.FamilySku).First());
  

Комментарии:

1. @ElianEbbing Я думаю, вы правы. Я хочу сгруппировать, если IsFamily и не группировать их, если IsFamily == False, но не исключать их (IsFamily == False).

Ответ №4:

 productList.Where(!a.Product.IsFamily).GroupBy(a => a.Product.FamilySku)
    .Select(grp => grp.OrderByDescending(a => a.Product.FamilySku).First());