У меня есть список объектов (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);
}