我正在使用包含轮类的护士日历:
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:问题的澄清 - 我需要计算周五晚类的类次,同时还有下周一早类的类次。
最佳答案
对于这个问题,您需要将集合交叉连接到自身 - 本质上,您需要获取每一个 对 的移位组合并计算第一个是 a 的对周五晚,第二个是周一早。
首先得到对:
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);
关于LinQ 查询中 lambda 表达式中的 C# 多个变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43895452/