检查数组中的重复预订

本文关键字:数组 检查 | 更新日期: 2023-09-27 18:31:21

好的,我的项目是为音乐比赛创建一个活动组织者。基本上,我获取输入数据,例如大约 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++;
                }
            }
        }

检查数组中的重复预订

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

如果我理解正确,您必须比较每列的值。我建议通过从实际集合类型派生来创建您自己的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);
        }
    }
}