2012-04-17 69 views
0

好的,我的項目是爲音樂比賽創建活動組織者。基本上我會輸入一些輸入數據,例如約400個條目的列表,然後按房間號碼和類型輸出到一些單獨的Excel表格中。問題是,將事件分配給一個數組時(每個房間都有一個單獨的數組,並且所有數組都包含在列表中),我需要檢查並修復伴奏者是否在同一時間段內雙重預訂。或者實質上,如果兩個不同的陣列具有相同的伴奏值[i]檢查陣列中的重複預訂

想法?請儘量解釋好,我自己只有一點點經驗告訴

private void assignEvents() 
    { 
    // assign every event in order 
    // check accompanists for no double-books 
     foreach (Event[] room in roomList) 
     { 
      int i = 0; 
      foreach (Event ev in eventList) 
      { 
       if (ev.Type == room[0].Type) 
       { 
        room[i] = ev; 
        i++; 
       } 
      } 
     } 
+1

爲什麼不可能性做一個LINQ GroupBy查詢關閉複合房間+時間鍵,然後找到所有的計數大於1的組?這會告訴你,如果你有任何雙重預訂。 – Tejs 2012-04-17 17:27:29

+0

@ Josiah1888:不客氣。此外,由於您是StackOverflow的新用戶,因此我想告訴您,您可以通過查看答案旁邊的勾號來獲得最佳答案並接受最能幫助您的答案。在這個網站上upvote或接受的答案算作「謝謝」。 – 2012-05-04 18:25:33

回答

0

你可以使用LINQ做這樣TEJS建議,但因爲你正在設計一個組織者,我會去另一條路線,你大概會需要額外的信息(例如,顯示伴奏者的時間表)。我將列出所有伴奏者的所有預訂(基本上是他們的時間表)的排序陣列。然後,您可以開始檢查每個新預訂是否存在預訂中每個伴奏者的衝突(在預約陣列中),如果不是,則繼續將預約添加到伴奏者的日程表

0

如果我正確理解你,你必須比較每列的值。我建議從您的實際集合類派生它來創建自己的RoomList集合類,並把它添加到迭代列

public class RoomList : List<Event[]> 
{ 
    public IEnumerable<Event> TimeSlot(int columnIndex) 
    { 
     foreach (Event[] events in this) { 
      if (events != null && columnIndex < events.Length) { 
       yield return events[columnIndex]; 
      } 
     } 
    } 
} 

然後你可以使用LINQ獲得重複預訂

RoomList roomList = new RoomList(); 
// ... 
for (int slot = 0; slot < roomList[0].Length; slot++) { 
    var doubleBooked = roomList.TimeSlot(slot) 
     .GroupBy(e => e.Type) 
     .Where(g => g.Count() > 1); 
    if (doubleBooked.Any()) { 
     Console.WriteLine("Doubly booked accompanists in slot {0}", slot); 
     foreach (var accompanistGroup in doubleBooked) { 
      Console.WriteLine(" {0}", accompanistGroup.Key); 
     } 
    } 
}