Подтвердить что ты не робот

Выберите записи, которые не имеют выходного дня в течение недели в списке <T> - С#

У меня есть класс Employee, который определяется как это:

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

Это реализация и использование моего класса:

List<Employee> workers = new List<Employee>()
{
    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},
};

В инициализации выше есть только 1 запись, которая выключена:

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

Теперь, как я могу получить идентификатор сотрудника, который не имеет выходного дня в течение недели (с 11 по 17 апреля)? Это Id = 2

A 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<EmployeeSchedule> workers = new List<EmployeeSchedule>()
{
    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},
};

Выбранный ответ по-прежнему применим.

4b9b3361

Ответ 1

Теперь, как я могу получить идентификатор сотрудника, у которого нет выходного дня в течение недели (с 11 по 17 апреля)? Который Id = 2

Вы можете использовать расширения Linq и достичь этого.

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

Ответ 2

Это означает, что вам нужно fromDate, toDate, и вам нужно найти сотрудников из списка при условии, что WorkDate должно находиться между fromDate и toDate, а также 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();   

Ответ 3

Вы можете написать примерно следующее:

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);

По существу:

  • Отфильтруйте нужные строки (в этот временной интервал)
  • Группировать по идентификатору сотрудника
  • Убедитесь, что ни одна из строк в группе не отмечена IsOff
  • Выберите ключ группировки (в этом случае это будет идентификатор сотрудника)

Обратите внимание, что это немного запутывает вызов объекта Employee, поскольку он действительно представляет собой расписание сотрудников, а не сам сотрудник

Ответ 4

попробуйте, у вас есть два идентификатора состояния и дата, но ваш идентификатор достаточен для получения вашего требования,

List<string> resEmp = new List<string>();

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

Ответ 5

Посмотрите на этот код.

я определил класс Model Employee для получения данных,

возможно, в настоящее время вам нужен идентификатор, но в будущем вы также можете использовать другие свойства.

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

и код с выражением Linq,

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