按嵌套集合的 LINQ 过滤器列表

Mic*_*nko 2 c# linq

我有以下类层次结构:

public class SportPlan
{
    public Guid Id { get; set; }
    public string Name { get; set; }
    public List<Record> RecordFields { get; set; }
}

public class Record
{
    public Guid Key { get; set; }
    public string Alias { get; set; }
    public List<Value> Values { get; set; }
}

public class Value
{
    public int Index { get; set; }
    public List<DayOfWeek> DaysOfWeek { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我需要SportPlan.RecordFieldsdayOfWeek(.NET enum)过滤并Value使用 LINQ获取s列表。我试过这样的事情,但它不起作用:

var filtredExercises = SportPlan.RecordFields.Select(x => x.Values.Where(v => v.DaysOfWeek.Equals(dayOfWeek))).ToList();
Run Code Online (Sandbox Code Playgroud)

ger*_*rmi 5

而不是Select,您需要使用Where来过滤您的列表。这样的事情应该接近你想要的:

var filteredExercises = SportPlan.RecordFields
                                 .Where(f => f.Values.Any(v => v.DaysOfWeek.Contains(dayOfWeek)))
                                 .ToList();
Run Code Online (Sandbox Code Playgroud)

这将为您提供所有包含您正在寻找RecordValuewhere 的s 。DaysOfWeekdayOfWeek

相反,如果您需要Value对象,则可以使用以下内容:

var filteredExercises = SportPlan.RecordFields
                             .SelectMany(f => f.Values)
                             .Where(v => v.DaysOfWeek.Contains(dayOfWeek))
                             .ToList();
Run Code Online (Sandbox Code Playgroud)

使用SelectMany,我们首先将Value对象列表的列表展平为 a IEnumerable<Value>,然后使用dayOfWeek.