2016-04-12 55 views
13

ho una classe di Employee che ha definito come questo:Selezionare i record che ha alcun giorno libero per tutta la settimana in List <T> - C#

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

Questa è la mia implementazione della classe e il loro utilizzo:

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

Nell'inizializzazione sopra c'è solo 1 informazione che è spento:

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

Ora come posso ottenere l'ID di un dipendente che non ha giorni liberi durante la settimana (dall'11 al 17 aprile)? Quale è Id = 2

A LINQ soluzione è molto meglio ma non so come farlo.

AGGIORNAMENTO

Per evitare confusione dell'oggetto Employee ho cambiato a EmployeeSchedule

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

Questa è l'implementazione

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

La risposta selezionata è ancora applicabile.

+0

È espressione Lamda ok? – Bharat

+0

'var list = workers.Where (x => x.IsOff == false)' non so quale estensione deve chiamare per filtrare 'Id = 2' –

+0

@Bharat ho bisogno di' LINQ' signore. –

risposta

10

Ora, come posso ottenere l'ID di un dipendente che non ha giorni liberi durante la settimana (dall'11 al 17 aprile)? Che è Id = 2

È possibile utilizzare le estensioni Linq e ottenere ciò.

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

Dovrai modificare '.Seleziona (x => x.Id)' per '.Selezionare (x => x.Key)' mentre si lavora sugli elementi raggruppati. – Valeklosse

2

provare, questo si hanno due condizioni id e la data, ma il tuo ID è sufficiente per ottenere il vostro requisito,

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

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

Questo significa che è necessario un fromDate, toDate, e dovete trovare i dipendenti dalla lista a condizione che, WorkDate dovrebbe essere tra fromDate e toDate, e anche questo significa isOff == falsehas no day off throughout the week modo da poter utilizzare il seguente frammento:

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

Questo non dice che non abbiano mai un giorno libero in quel periodo. Restituirà i giorni che non sono disattivati, non gli ID – Rob

+2

@Rob c'è solo un GroupBy (g => x.id) richiesto – Mafii

3

È possibile scrivere qualcosa del genere:

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

In sostanza:

  1. filtrare le righe è necessario (in questo lasso di tempo)
  2. Gruppo per dipendente id
  3. Assicurati che nessuno delle righe nel gruppo siano mar ked IsOff
  4. Selezionare la chiave di raggruppamento (in questo caso, sarà l'ID del dipendente)

Nota però, è un po 'di confusione chiamando l'oggetto Employee, in quanto rappresenta in realtà programma di un dipendente, piuttosto che un impiegato in sé

2

Guarda anche questo codice.

ho definito una classe del modello di Employee per ottenere i dati,

forse attualmente è necessario Id ma in futuro è possibile utilizzare altre proprietà troppo.

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

e Codice addebbitato 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

Anche questo è utile –

Problemi correlati