我有下一个类层次结构:
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();但是在这种情况下,如果我有两个值:第一个值- DaysOfWeek- Value,第二个值-星期一,当我尝试在周日过滤时,我得到了这两个值。但是我需要包含特定星期几的值。
P.S. dayOfWeek是.NET枚举
发布于 2020-04-22 17:42:19
问题是,如果匹配只能精确到一周中的一天,为什么还要在类值中列出一周中的某一天?那么value不应该看起来像这样吗?
public class Value
{
public int Index { get; set; }
public DayOfWeek d { get; set; }
}或者,您是否希望能够检查List<DayOfWeek> DaysOfWeek是否包含与您想要比较的完全相同的组合,例如,周一和周日,那么列表需要包含且仅包含周一和周日?或者星期三、星期五和星期四,那么列表必须只包含这些值,并且所有3个值都需要存在?
无论如何,在这种情况下,您只需要比较一个条目,并且它应该是列表中的唯一条目(正如您所描述的那样),可以如上所述重写values类。或者你可以像这样检查它:
var filtredExercises = uRecordFields
.Where(f => f.Values.Any( v => v.DaysOfWeek.count = 1 && v.DaysOfWeek.FirstOrDefault() == dayofweek))
.ToList();也许这种方法更具可读性。如果您的类允许同一天的多个条目,您还可以在firstordefault()之前添加distinct()。
您还可以对类值执行一个方法,该方法为您执行检查,然后在lambda中调用该方法。但这取决于检查的自然责任是否在类本身。
发布于 2020-04-22 17:35:04
我假设的是,您也需要过滤匹配的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();https://stackoverflow.com/questions/61361088
复制相似问题