0

わかりました、音楽コンテストのイベント オーガナイザーを作成するプロジェクトです。基本的には400件程度のリストを入力し、部屋番号別、部屋タイプ別のエクセルシートに出力しています。問題は、イベントを配列に割り当てるときに (各部屋に個別の配列があり、すべての配列がリストに含まれています)、伴奏者が同じ時間帯に二重に予約されているかどうかを確認して修正する必要があることです。または本質的に、2 つの異なる配列が配列 [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

私があなたを正しく理解していれば、列ごとに値を比較する必要があります。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 に答える
0

Tejs が提案するように LINQ でそれを行うこともできますが、オーガナイザーを設計していて、何らかの方法で追加情報が必要になる可能性があるため (たとえば、伴奏者のスケジュールを表示するため)、別の方法を使用します。すべての伴奏者のリストと、すべての予約 (基本的にはスケジュール) の並べ替えられた配列を持っています。次に、すべての新しい予約について、予約の各伴奏者に対して (予約配列に) 競合があるかどうかを確認する機能を使用できます。競合がない場合は、伴奏者のスケジュールに予約を追加して続行します。

于 2012-04-17T17:36:43.597 に答える