2009-04-16 4 views
1

У меня есть класс, который представляет собой сдвиг, который работник может работать:Tricky Linq Group по для диапазонов времени

public class Shift { 
    public int Id { get; set;} 
    public DateTime Start {get;set;} 
    public DateTime End { get; set;} 
    public DayOfWeek Day { get; set;} 
} 

И у меня есть список этих изменений для одного сотрудника:

List<Shift> myShifts; 

Я знаю, что могу получить группу сдвигов от дня со следующим утверждением: LinQ

var shiftsByDay = from a in myShift 
        group a by a.Day; 

Мой вопрос: Для каждого дня, как я могу получить все смены, которые перекрываются, в отдельных группах, без двойного подсчета?

С перекрывающимся сдвигом, где либо начало, либо время окончания перекрываются с другими сдвигами начала или окончания.

Я хотел бы иметь возможность сделать это с помощью linq, если это вообще возможно.

ответ

3

Во-первых, я думаю, было бы проще, если бы вы дали каждому сместит уникальный идентификатор, так что вы можете отличить его. Тогда я думаю, вы можете использовать Where, чтобы выбрать каждый элемент, который имеет какие-либо конфликты с другим элементом коллекции. Наконец, вы можете группировать их днем. Обратите внимание, что это не скажет вам, какие смены конфликтуют, только те, у кого есть конфликт в любой день.

public class Shift { 
    public int ID { get; set; } 
    public DateTime Start {get;set;} 
    public DateTime End { get; set;} 
    public DayOfWeek Day { get; set;} 
} 

var query = shifts.Where(s1 => shifts.Any(s2 => s1.ID != s2.ID 
             && s1.Day == s2.Day 
             && (s2.Start <= s1.Start && s1.Start <= s2.End) 
              || (s1.Start <= s2.Start && s2.Start <= s1.End)) 
        .GroupBy(s => s.Day); 

foreach (var group in query.OrderBy(g => g.Key)) 
{ 
    Console.WriteLine(group.Key); // Day of Week 
    foreach (var shift in group) 
    { 
     Console.WriteLine("\t" + shift.ID); 
    } 
} 
+0

Спасибо tvanfosson, я опустил факт, что каждый сдвиг имеет уникальный идентификатор, но у них есть они. Лемме отредактируйте его. – Alan

Смежные вопросы