2016-04-12 52 views
13

Mam Employee klasy, które zdefiniowane jako to:Zaznacz rekordy, które nie ma dnia wolnego w ciągu tygodnia w List <T> - C#

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

To moja klasa wdrożenie i użytkowanie:

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}, 
}; 

W inicjacji powyżej jest tylko 1 rekord, który jest wyłączony:

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

Jak mogę uzyskać identyfikator pracownika, który nie ma wolnego dnia przez cały tydzień (od 11 do 17 kwietnia)? To jest rozwiązanie znacznie lepsze, ale nie wiem jak to zrobić.

AKTUALIZACJA

Aby uniknąć nieporozumień obiektu Employee Zmieniłem go EmployeeSchedule

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

To jest realizacja

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}, 
}; 

Wybrana odpowiedź jest nadal stosowane.

+0

Czy wyrażenie Lambda ok? – Bharat

+0

'var list = workers.Where (x => x.IsOff == false)' nie wiem, jakie rozszerzenie musi zostać wywołane do filtrowania 'Id = 2' –

+0

@Bharat Potrzebuję' LINQ' sir. –

Odpowiedz

10

Jak mogę uzyskać identyfikator pracownika, który nie ma dnia wolnego od przez cały tydzień (od 11-17 kwietnia)? Który jest Id = 2

Możesz użyć rozszerzeń Linq i osiągnąć to.

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

Będziesz musiał zmienić '.Select (x => x.Id)' do '. Wybierz (x => x.Key)' jak pracujesz nad zgrupowanymi elementami. – Valeklosse

2

spróbować, to masz dwa warunek identyfikator i datę, ale Twój identyfikator jest niewystarczający dla dostać swoje wymagania,

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

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

Oznacza to, że potrzebujemy fromDate, toDate, i trzeba znaleźć pracowników z listy pod warunkiem, że WorkDate powinny być między fromDate i toDate, a także isOff == false to znaczy has no day off throughout the week Więc można użyć następującego fragmentu:

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(); 
+0

To nie mówi, że nigdy nie mają wolnego dnia w tym okresie. Zwróci dni, które nie są wyłączone, a nie identyfikatory – Rob

+2

@Rob jest tylko GroupBy (g => x.id) wymagane – Mafii

3

można napisać coś takiego:

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

Zasadniczo:

  1. filtrować wiersze potrzebne (w tym przedziale czasowym)
  2. Grupa przez ID pracownika
  3. Upewnij się, że none z wierszy w grupie to mar KED IsOff
  4. Wybierz klucz grupowania (w tym przypadku, to będzie pracownika Id)

Uwaga jednak, że jest to nieco mylące wywołanie obiektu Employee, jak to naprawdę przedstawia harmonogram pracownika, zamiast sam pracownik:

2

Sprawdź również ten kod.

mam zdefiniowano klasę modelu pracownika, aby uzyskać dane,

może obecnie trzeba Id ale w przyszłości można użyć innego właściwości zbyt.

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

i kod wtih 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(); 
+1

Ten również jest przydatny –