LinQ查询中的lambda表达式中的C#多变量

Dra*_*cke 7 c# linq lambda

我正在使用由班次组成的护士日历:

public interface IShift
{
    ShiftType ShiftType { get; } //enum {Day, Early, Late, Night}
    DateTime Day { get; }
    bool IsNightShift();
    bool IsWeekendShift();
}
Run Code Online (Sandbox Code Playgroud)

护士日历是IEnumerable<IShift>.从那时起,我选择自己的shift(IEnumerable<IShift> selectedShifts)一段较短的时间来检查一些约束.

我试图计算多个条件,例如星期五的夜班:

var countFridayNight = selectedShifts.Count(s => s.IsNightShift() 
    && s.Day.DayOfWeek == DayOfWeek.Friday);
Run Code Online (Sandbox Code Playgroud)

我正在努力的是多天计算多件事.例如,周五晚班和下周一早班.我试过这个,但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
                            );
Run Code Online (Sandbox Code Playgroud)

编辑:删除最后一个lambda表达式中的花括号.

Edit2:有两条评论说Count不能在lambda表达式中使用多个变量.我怎样才能做我需要使用LINQ的东西?

编辑3:澄清问题 - 我需要计算周五晚班制的变化,同时,还有另一个变化,即下周一早些时候.

Tim*_*ers 5

您需要集合交叉联接本身对于这个问题-本质上,你需要让每一个移组合和计数其中第一个是上周五尾盘,第二个是一个星期一早上.

首先得到对:

var pairs = selectedShifts.SelectMany(s => selectedShifts, Tuple.Create);
Run Code Online (Sandbox Code Playgroud)

其次,计算符合您条件的对:

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);
Run Code Online (Sandbox Code Playgroud)

您可以更有效地,如果转移已经下令相继获得对了,你需要计算相邻的变化:

var pairs = selectedShifts.Zip(selectedShifts.Skip(1), Tuple.Create);
Run Code Online (Sandbox Code Playgroud)

  • 这不是假设源是有序的,并且在周五晚和周一早期之间不可能有另一次转换吗? (2认同)
  • @FilipCordas:不会.虽然每一对都会出现两次.只有第一个成员是星期五而第二个成员是星期一的对将被计算在内.反转的一对不会. (2认同)