我正在使用由轮类组成的护士日历:

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

10-08 01:05