2009-04-16 60 views
1

我有代表一個轉變,員工可以工作類:整蠱的LINQ集團通過時間範圍

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,我省略了每個班次都有唯一ID的事實,但他們確實擁有它們。讓我編輯它。 – Alan 2009-04-16 03:49:12