我正在使用由轮类组成的护士日历:
public interface IShift
{
ShiftType ShiftType { get; } //enum {Day, Early, Late, Night}
DateTime Day { get; }
bool IsNightShift();
bool IsWeekendShift();
}
护士日历是
IEnumerable<IShift>
。从那以后,我选择自己的类次 ( IEnumerable<IShift> selectedShifts
) 更短的时间来检查一些限制。我正在尝试计算多个条件,例如,周五夜类:
var countFridayNight = selectedShifts.Count(s => s.IsNightShift()
&& s.Day.DayOfWeek == DayOfWeek.Friday);
我正在努力的是在多日内计算多件事。例如周五晚类和下周一早类。
我试过这个,但 VS 似乎不喜欢这个语法:
var countFridayLateAndMondayEarly =
selectedShifts.Count(
(r, s) => s.ShiftType == ShiftType.Late && s.Day.DayOfWeek == DayOfWeek.Friday
&& r.Day.DayOfWeek == DayOfWeek.Monday && r.Day.AddDays(-2).DayOfYear == s.Day.DayOfYear && r.ShiftType == ShiftType.Early
);
编辑:删除了最后一个 lambda 表达式中的花括号。
Edit2:有两条评论说 Count 不能在 lambda 表达式中使用多个变量。我还能如何做我需要使用 LINQ 的事情?
Edit3:澄清问题 - 我需要计算周五晚类的类次,同时还有另一个类次是下周一早类。
最佳答案
对于这个问题,您需要将集合交叉连接到自身 - 本质上,您需要获取每对轮类组合,并计算第一个是星期五晚些时候而第二个是星期一早些时候的对。
首先得到对:
var pairs = selectedShifts.SelectMany(s => selectedShifts, Tuple.Create);
其次,计算符合您标准的对:
var count = pairs.Count(pair =>
pair.Item1.ShiftType == ShiftType.Late
&& pair.Item1.Day.DayOfWeek == DayOfWeek.Friday
&& pair.Item2.Day.DayOfWeek == DayOfWeek.Monday
&& pair.Item2.Day.AddDays(-2).DayOfYear == pair.Item1.Day.DayOfYear
&& pair.Item2.ShiftType == ShiftType.Early);
如果类次已经按顺序排列,您可以更有效地获得对,并且您只想计算相邻类次:
var pairs = selectedShifts.Zip(selectedShifts.Skip(1), Tuple.Create);