在List – C#中选择整周没有rest日的记录

我有一个Employee类,定义如下:

 Employee { public int Id { get; set; } public string Name { get; set; } public DateTime WorkDate { get; set; } public bool isOff { get; set; } } 

这是我的类实现和用法:

 List workers = new List() { new Employee { Id = 1, Name = "Emp 1", WorkDate = Convert.ToDateTime("4/11/2016"), IsOff = false}, new Employee { Id = 1, Name = "Emp 1", WorkDate = Convert.ToDateTime("4/12/2016"), IsOff = false}, new Employee { Id = 1, Name = "Emp 1", WorkDate = Convert.ToDateTime("4/13/2016"), IsOff = true}, new Employee { Id = 1, Name = "Emp 1", WorkDate = Convert.ToDateTime("4/14/2016"), IsOff = false}, new Employee { Id = 1, Name = "Emp 1", WorkDate = Convert.ToDateTime("4/15/2016"), IsOff = false}, new Employee { Id = 1, Name = "Emp 1", WorkDate = Convert.ToDateTime("4/16/2016"), IsOff = false}, new Employee { Id = 1, Name = "Emp 1", WorkDate = Convert.ToDateTime("4/17/2016"), IsOff = false}, new Employee { Id = 2, Name = "Emp 2", WorkDate = Convert.ToDateTime("4/11/2016"), IsOff = false}, new Employee { Id = 2, Name = "Emp 2", WorkDate = Convert.ToDateTime("4/12/2016"), IsOff = false}, new Employee { Id = 2, Name = "Emp 2", WorkDate = Convert.ToDateTime("4/13/2016"), IsOff = false}, new Employee { Id = 2, Name = "Emp 2", WorkDate = Convert.ToDateTime("4/14/2016"), IsOff = false}, new Employee { Id = 2, Name = "Emp 2", WorkDate = Convert.ToDateTime("4/15/2016"), IsOff = false}, new Employee { Id = 2, Name = "Emp 2", WorkDate = Convert.ToDateTime("4/16/2016"), IsOff = false}, new Employee { Id = 2, Name = "Emp 2", WorkDate = Convert.ToDateTime("4/17/2016"), IsOff = false}, }; 

在上面的初始化中,只有一条记录关闭:

Id = 1, Name = "Emp 1" and the WorkDate = 4/13/2016

现在我怎样才能获得一周内(4月11日至17日)没有rest日的员工的身份certificate? 这是Id = 2

LINQ解决方案要好得多,但我不知道该怎么做。

更新

为避免混淆对象Employee我将其更改为EmployeeSchedule

 class EmployeeSchedule { public int Id { get; set; } public string Name { get; set; } public DateTime WorkDate { get; set; } public bool isOff { get; set; } } 

这是实施

 List workers = new List() { new EmployeeSchedule{ Id = 1, Name = "Emp 1", WorkDate = Convert.ToDateTime("4/11/2016"), IsOff = false}, new EmployeeSchedule{ Id = 1, Name = "Emp 1", WorkDate = Convert.ToDateTime("4/12/2016"), IsOff = false}, new EmployeeSchedule{ Id = 1, Name = "Emp 1", WorkDate = Convert.ToDateTime("4/13/2016"), IsOff = true}, new EmployeeSchedule{ Id = 1, Name = "Emp 1", WorkDate = Convert.ToDateTime("4/14/2016"), IsOff = false}, new EmployeeSchedule{ Id = 1, Name = "Emp 1", WorkDate = Convert.ToDateTime("4/15/2016"), IsOff = false}, new EmployeeSchedule{ Id = 1, Name = "Emp 1", WorkDate = Convert.ToDateTime("4/16/2016"), IsOff = false}, new EmployeeSchedule{ Id = 1, Name = "Emp 1", WorkDate = Convert.ToDateTime("4/17/2016"), IsOff = false}, new EmployeeSchedule{ Id = 2, Name = "Emp 2", WorkDate = Convert.ToDateTime("4/11/2016"), IsOff = false}, new EmployeeSchedule{ Id = 2, Name = "Emp 2", WorkDate = Convert.ToDateTime("4/12/2016"), IsOff = false}, new EmployeeSchedule{ Id = 2, Name = "Emp 2", WorkDate = Convert.ToDateTime("4/13/2016"), IsOff = false}, new EmployeeSchedule{ Id = 2, Name = "Emp 2", WorkDate = Convert.ToDateTime("4/14/2016"), IsOff = false}, new EmployeeSchedule{ Id = 2, Name = "Emp 2", WorkDate = Convert.ToDateTime("4/15/2016"), IsOff = false}, new EmployeeSchedule{ Id = 2, Name = "Emp 2", WorkDate = Convert.ToDateTime("4/16/2016"), IsOff = false}, new EmployeeSchedule{ Id = 2, Name = "Emp 2", WorkDate = Convert.ToDateTime("4/17/2016"), IsOff = false}, }; 

所选答案仍然适用。

现在我怎样才能获得一周内(4月11日至17日)没有rest日的员工的身份certificate? 这是Id = 2

您可以使用Linq扩展,并实现此目的。

 var empid = workers.GroupBy(g=> g.Id) .Where(x=>x.All(e=>!e.IsOff)) .Select(x=>x.Key) 

这意味着您需要一个fromDatetoDate ,并且您必须从列表中找到员工,条件是WorkDate应该介于fromDatetoDate之间,并且isOff == false这意味着has no day off throughout the week所以您可以使用以下代码段:

  DateTime fromDate = new DateTime(2016, 04, 11); DateTime toDate = new DateTime(2016, 04, 17); var noDayOfList = workers.GroupBy(x=> x.Id) .Where(x => x.All(y=> y.WorkDate >= fromDate && y.WorkDate <= toDate && !y.isOff)) .Select(z=>z.Key).ToList(); 

你可以写这样的东西:

 var startDate = new DateTime(2016,04,11); var endDate = new DateTime(2016,04,17); var ids = workers .Where(w => w.WorkDate >= startDate) .Where(w => w.WorkDate <= endDate) .GroupBy(w => w.Id) .Where(g => !g.Any(w => w.IsOff)) .Select(g => g.Key); 

实质上:

  1. 过滤所需的行(在此时间范围内)
  2. 按员工ID分组
  3. 确保组中没有任何行标记为IsOff
  4. 选择分组键(在这种情况下,它将是员工的ID)

但请注意,调用对象Employee有点令人困惑,因为它实际上代表了员工的日程安排,而不是员工本身

试试,你有两个条件id和日期,但你的id足以满足你的要求,

 List resEmp = new List(); foreach (var item in workers ) { if (item.Id == 2 and item.IsOff == false) { resEmp.Add(item); } } 

看看这些代码。

我已经定义了一个Employee的Model类来获取数据,

也许你现在需要Id,但在未来你也可以使用其他属性。

 public class Employee { public int Id { get; set; } public string Name { get; set; } public DateTime WorkDate { get; set; } public bool IsOff { get; set; } } 

和Linq Expression的代码,

  Employee objEmployee = new Employee(); objEmployee.Id = workers .GroupBy(itm => itm.Id) .Where(itm => !itm.Any(m => m.IsOff)) .Select(itm => itm.Key) .FirstOrDefault();