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

标签 c# linq lambda

我正在使用包含轮类的护士日历:

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/

相关文章:

c# - 将数据从服务器发送到特定客户端

c# - DbConnection 与 OleDbConnection 与 OdbcConnection

c# - 在Arcgis中使用GeoReference使用Word文件

集合和迭代器的 C# 性能

c# - linq2sql 如何跟踪数据库对象?

c# - LINQ GroupBy 抛出错误

c# - 根据日期时间过滤大列表

c# - 如何在 Entity Framework 中获取数字字符串列的最大值

java - 在 Filter 函数中使用 CompletableFuture

lambda函数内的python迭代过程