繁体   English   中英

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

[英]LINQ filter list by nested collection

我有以下类层次结构:

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; }
}

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

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

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

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

这将为您提供所有具有Value Record s,其中DaysOfWeek包含您正在寻找的dayOfWeek

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

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

使用SelectMany ,我们首先将Value对象列表的列表展平为IEnumerable<Value> ,然后使用dayOfWeek进行过滤。

你可以试试这个:

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

如果要匹配 DaysOfWeek 列表中的任何现有项目,请尝试以下操作:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM