@VanilaSpirit

C#. Как правильнее переписать LINQ запрос?

Есть большой лист из листов, к котором примерно такая структура:
List<CatalogItems> -> List<Catalogs> -> List<SubCategories> -> List<CatalogCategories>

В каждой из них есть лист предыдущего и парам. Visible.

Написал запрос, который фильтрует и убирает все те элементы, в которых нет Visible или список пуст уровнем ниже:

CatalogCategories = CatalogCategories
.Where(x => x.SubCategories
    .Any(z => z.Visible  && z.Catalogs
        .Any(q => q.Visible && q.CatalogItems
            .Any(w => w.Visible ))))
.ToList();

Проблема в том, что он убирает запись из CatalogCategories только при условии, что все элементы листа соответствуют одному условию, а идея была в том, чтобы просто убрать любой элемент, не подходящий под него.
  • Вопрос задан
  • 73 просмотра
Пригласить эксперта
Ответы на вопрос 1
Мне кажется, тут лучше вместо linq использовать обычные циклы. (если я правильно понял задачу, что нужно и вложенные элементы тоже фильтровать).
var cc = CatalogCategories;
CatalogCategories = new List<CatalogCategory>();
foreach(var cat in cc.Where(x=>x.Visible) {
  var subCategories = new List<SubCategory>();
  foreach(var subCat in cc.SubCategories.Where(x=>x.Visible) {
    var catalogs = new List<Catalog>();
    foreach(var catalog in subCat.Catalogs.Where(x=>x.Visible) {
        var items = catalog.CatalogItems.Where(x=>x.Visible).ToList();
        if(items.Any()) {
            catalog.CatalogItems = items;
            catalogs.Add(catalog);
        }
    }
    if(catalogs.Any()) {
        subCat.Catalogs = catalogs;
        subCategories.Add(subCat);
    }
  }
  if(subCategories.Any()) {
    cat.SubCategories = subCategories;
    CatalogCategories.Add(cat);
  }
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы