Фильтр списка объектов, где вложенная коллекция соответствует массиву - PullRequest
0 голосов
/ 22 ноября 2018

У меня есть список объектов (items), которые я хотел бы отфильтровать на основе значений вложенной коллекции (Features в объекте GenericItem).В качестве основы для фильтра у меня есть массив int (filter).Моя цель - найти все объекты в items, где коллекция Features включает как минимум все значения в массиве filter.

В соответствии со многими решениями, предоставленными другим пользователям в Stackoverflow Iнаписал ниже.У меня проблема в том, что в моем запросе Linq (и во многих вариантах, которые я пробовал) я всегда получаю все объекты в items, где все Features включены в filter.Я понимаю, что мое лямбда-выражение «в неправильном порядке», однако, поскольку я хочу получить список GenericItem, я не могу понять, как написать свое выражение.

Как следуетЯ пишу выражение Linq, чтобы получить ожидаемый результат?

Так что ниже, когда я фильтрую для массива [2, 3], моя цель состоит в том, чтобы получить result, содержащий «Item A» и «Item B»(оба имеют как минимум функции 2 и 3).Вместо этого я получаю result «Предмета B» и «Предмета C», поскольку все их Features включены в массив filter.

public class GenericItem {
    public int Id { get; set; }
    public string Name { get; set; }
    public ICollection<Feature> Features { get; set; }
}

public class Feature {
    public int Id { get; set; }
}

static void Main (string[] args) {

    var items = new List<GenericItem>();
    items.Add(new GenericItem() {
        Id = 1,
        Name = "Item A",
        Features = new Collection<Feature>() { 
            new Feature() {Id = 1},      
            new Feature() {Id = 2},      
            new Feature() {Id = 3}
        }      
    });
    items.Add(new GenericItem() {
        Id = 2,
        Name = "Item B",
        Features = new Collection<Feature>() {     
            new Feature() {Id = 2},      
            new Feature() {Id = 3}
        }      
    });
    items.Add(new GenericItem() {
        Id = 3,
        Name = "Item C",
        Features = new Collection<Feature>() {    
            new Feature() {Id = 3}
        }
    });

    int[] filter = new int[] {2, 3};

    var resultAll = items.Where(i => i.Features.All(f => filter.Contains(f.Id)));

    foreach (GenericItem I in resultAll)
        System.Console.WriteLine(I.Name);
}

1 Ответ

0 голосов
/ 22 ноября 2018

Применить All к коллекции filter вместо i.Features:

var resultAll = items.Where(i => filter.All(x => i.Features.Any(f => x == f.Id)));
...