2012-04-17 42 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); 
     } 
    } 
}