我正在使用由班次组成的护士日历:
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:澄清问题 - 我需要计算周五晚班制的变化,同时,还有另一个变化,即下周一早些时候.
您需要集合交叉联接本身对于这个问题-本质上,你需要让每一个对移组合和计数对其中第一个是上周五尾盘,第二个是一个星期一早上.
首先得到对:
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)
| 归档时间: |
|
| 查看次数: |
1900 次 |
| 最近记录: |