[英]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.