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++;
                }
            }
        }
4

2 回答 2

0

你可以像 Tejs 建议的那样用 LINQ 来做,但我会走另一条路,因为你正在设计一个组织者,你可能需要额外的信息(例如,显示伴奏者的日程安排)。我会有一份所有伴奏者的列表,其中包含他们所有预订的排序数组(基本上是他们的日程安排)。然后,您可以使用一个功能来检查每个新预订是否与预订中的每个伴奏者存在冲突(在预订数组中),如果没有,则继续将预订添加到伴奏者的日程表中

于 2012-04-17T17:36:43.597 回答
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);
        }
    }
}
于 2012-04-17T17:52:56.513 回答