[英]c# LINQ filter nested collection
我有下一个 class 层次结构:
public class URecordFieldEmr
{
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; }
}
我需要按星期几过滤List<URecordFieldEmr>
,所以我正在尝试这样:
var filtredExercises = uRecordFields
.Where(f => f.Values.Any(v => v.DaysOfWeek.Contains(dayOfWeek)))
.ToList();
但在这种情况下,如果我有两个Value
:第一个值 - DaysOfWeek
- 星期日,第二个值 - 星期一,当我尝试按星期天过滤时,我得到这两个值。 但我需要包含特定星期几的值。
PS dayOfWeek 是 .NET 枚举
问题是,如果匹配只能是精确的一周,为什么你甚至在 class 值中有一个星期列表? 那么价值不应该看起来像这样吗?
public class Value
{
public int Index { get; set; }
public DayOfWeek d { get; set; }
}
或者您是否还希望能够检查List<DayOfWeek> DaysOfWeek
是否包含与您想要比较的完全相同的组合,例如周一和周日,那么列表需要准确且仅包含周一和周日? 或者周三、周五和周四,那么列表只必须包含这些值并且所有 3 个都需要存在?
无论如何,如果您只需要比较一个条目并且它应该是列表中的唯一条目(如您所描述的那样),请如上所述重写值 class 。 或者你可以像这样检查它:
var filtredExercises = uRecordFields
.Where(f => f.Values.Any( v => v.DaysOfWeek.count = 1 && v.DaysOfWeek.FirstOrDefault() == dayofweek))
.ToList();
也许这种方法更具可读性。 如果您的 class 允许同一天的多个条目,您也可以在 firstordefault() 之前添加 distinct()。
您还可以对 class 值执行一个方法来为您进行检查,然后在 lambda 中调用该方法。 但这取决于检查的自然责任是否在 class 本身。
我假设的是,您需要过滤匹配的Values
属性对吗? 如果是这样,以下查询可能会有所帮助
var result = uRecordFields.Select(x => new URecordFieldEmr
{
Values = x.Values.Where(y => y.DaysOfWeek.Any(z => z == DayOfWeek.Sunday)).ToList(),
Alias = x.Alias,
Key = x.Key
}).Where(x => x.Values != null && x.Values.Count != 0).ToList();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.