检查阵列中的双重预订

时间:2012-04-17 17:19:04

标签: c# arrays

好的,我的项目是为音乐比赛创建一个活动组织者。基本上我采用输入数据,例如大约400个条目的列表,并按房间号和类型输出到几个单独的Excel表中。问题是,当为一个数组分配事件时,(我为每个房间都有一个单独的数组,并且所有数组都包含在一个列表中)我需要检查并修复是否在同一时间段内将伴奏者重复预订。或者基本上,如果两个不同的数组对于array [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++;
                }
            }
        }

2 个答案:

答案 0 :(得分:0)

你可以像Tejs建议的那样使用LINQ,但是我会选择其他路线,因为你正在设计一个组织者,你可能需要任何方式的额外信息(例如,显示一个伴奏者的时间表)。我会列出所有伴奏者的列表,其中包含所有预订的排序(基本上是他们的日程安排)。然后,您可以使用功能检查每个新预订是否在预订中为每个伴奏者发生冲突(在预订阵列中),如果没有,请继续将预订添加到伴奏者的时间表中

答案 1 :(得分: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);
        }
    }
}