Выберите записи, которые не имеют выходного дня в течение недели в списке <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},
};
Выбранный ответ по-прежнему применим.
Ответы
Ответ 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();