首页 > 解决方案 > 嵌套集合的 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; }
}

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

var filtredExercises = SportPlan.RecordFields.Select(x => x.Values.Where(v => v.DaysOfWeek.Equals(dayOfWeek))).ToList();

标签: c#linq

解决方案


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

var filteredExercises = SportPlan.RecordFields
                                 .Where(f => f.Values.Any(v => v.DaysOfWeek.Contains(dayOfWeek)))
                                 .ToList();

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

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

var filteredExercises = SportPlan.RecordFields
                             .SelectMany(f => f.Values)
                             .Where(v => v.DaysOfWeek.Contains(dayOfWeek))
                             .ToList();

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


推荐阅读