示例#1
0
        static int[] findSignatureCounts(int[] masterPassItToStudent)
        {
            if (masterPassItToStudent == null || masterPassItToStudent.Length == 0)
            {
                throw new ArgumentException("Invalid Parameter");
            }

            IGameBuilder gameBuilder = new GameBuilder();
            Dictionary <IIdentifier, IParticipant> studentDictionary = new Dictionary <IIdentifier, IParticipant>(masterPassItToStudent.Length);
            List <int> signCount = new List <int>(masterPassItToStudent.Length);

            int[] passItToStudent = masterPassItToStudent;
            int   nonParticpantCount;

            do
            {
                List <int> nextPassItToStudent = new List <int>(passItToStudent.Length);
                signCount.Clear();
                nonParticpantCount = 0;

                for (int index = 0; index < passItToStudent.Length; index++)
                {
                    IIdentifier studentIdentifierPassFrom = gameBuilder.CreateIdentifier(index + 1);
                    IIdentifier studentIdentifierPassTo   = gameBuilder.CreateIdentifier(passItToStudent[index]);

                    if (Convert.ToInt32(studentIdentifierPassTo.GetIdentifier()) < 1)
                    {
                        throw new Exception("Value less than zero not allowed.");
                    }

                    //If new Student then add to dictionary and sign their yearbook
                    IParticipant studentPassFrom = GetOrAddParticipantIfMissing(gameBuilder, studentDictionary, studentIdentifierPassFrom);                    //If new Student then add to dictionary and sign their yearbook
                    IParticipant studentPassTo   = GetOrAddParticipantIfMissing(gameBuilder, studentDictionary, studentIdentifierPassTo);

                    if (!studentPassFrom.Equals(studentPassTo))
                    {
                        IYearBook yearBook = studentPassFrom.PassYearBook();
                        studentPassTo.RecieveYearBook(yearBook);
                    }
                    else
                    {
                        studentPassFrom.NoLongerAllowedToParticipate();
                    }

                    nextPassItToStudent.Add(masterPassItToStudent[passItToStudent[index] - 1]);
                }

                for (int index = 0; index < passItToStudent.Length; index++)
                {
                    IIdentifier  studentIdentifier = gameBuilder.CreateIdentifier(index + 1);
                    IParticipant student           = studentDictionary[studentIdentifier];
                    student.Sign();
                    signCount.Add(student.GetMyYearBook().GetSignedStudents().Count);

                    if (!student.IsParticipant())
                    {
                        nonParticpantCount++;
                    }
                }

                passItToStudent = nextPassItToStudent.ToArray();
            } while (nonParticpantCount != masterPassItToStudent.Length);

            return(signCount.ToArray());
        }