private List <SHSubjectYearScoreInfo> GetPersonalYearSubjectScoreInfo(List <SHSubjectSemesterScoreInfo> pSHSubjectSemesterScoreInfo)
        {
            List <SHSubjectYearScoreInfo> _SHSubjectYearScoreInfo = new List <SHSubjectYearScoreInfo>();
            int i = -1;

            do
            {
                i++;
                SHSubjectSemesterScoreInfo _SHSubjectSemesterScoreInfo;

                if ((pSHSubjectSemesterScoreInfo.Count <= i))
                {
                    break;
                }

                _SHSubjectSemesterScoreInfo = pSHSubjectSemesterScoreInfo[i];

                string keySingleSubject = _SHSubjectSemesterScoreInfo.StudentID + "_" + _SHSubjectSemesterScoreInfo.SchoolYear.ToString() + "_" + _SHSubjectSemesterScoreInfo.SubjectName;

                SHSubjectYearScoreInfo pSHSubjectYearScoreInfo = this.GetPersonalSubjectYearScoreInfo(_SHSubjectSemesterScoreInfo.StudentID, _SHSubjectSemesterScoreInfo.SchoolYear, _SHSubjectSemesterScoreInfo.SubjectName, _SHSubjectSemesterScoreInfo.GradeYear);

                if (pSHSubjectYearScoreInfo == null)
                {
                    pSHSubjectYearScoreInfo = new SHSubjectYearScoreInfo();

                    pSHSubjectYearScoreInfo.StudentID   = _SHSubjectSemesterScoreInfo.StudentID;
                    pSHSubjectYearScoreInfo.SchoolYear  = _SHSubjectSemesterScoreInfo.SchoolYear;
                    pSHSubjectYearScoreInfo.SubjectName = _SHSubjectSemesterScoreInfo.SubjectName;
                    //pSHSubjectYearScoreInfo.Score = _SHSubjectSemesterScoreInfo
                    //pSHSubjectYearScoreInfo.Credit = _SHSubjectSemesterScoreInfo.StudentID;
                    pSHSubjectYearScoreInfo.GradeYear = _SHSubjectSemesterScoreInfo.GradeYear;
                    pSHSubjectYearScoreInfo.Hour      = (_SHSubjectSemesterScoreInfo.Credit.HasValue ? _SHSubjectSemesterScoreInfo.Credit.Value + "" : string.Empty);
                }
                else
                {
                    pSHSubjectYearScoreInfo.AccumulatedCredit = 0;

                    decimal?creditSemester = 0;

                    pSHSubjectYearScoreInfo.AccumulatedCredit += (_SHSubjectSemesterScoreInfo.Credit.HasValue ? _SHSubjectSemesterScoreInfo.Credit.Value : 0);

                    if (_SHSubjectSemesterScoreInfo.Pass.HasValue)
                    {
                        if (_SHSubjectSemesterScoreInfo.Pass.Value)
                        {
                            creditSemester = (_SHSubjectSemesterScoreInfo.Credit.HasValue ? _SHSubjectSemesterScoreInfo.Credit.Value : 0);
                        }
                    }

                    pSHSubjectYearScoreInfo.Credit = creditSemester;
                    pSHSubjectYearScoreInfo.Hour   = (_SHSubjectSemesterScoreInfo.Credit.HasValue ? _SHSubjectSemesterScoreInfo.Credit.Value + "" : string.Empty);
                }
                _SHSubjectYearScoreInfo.Add(pSHSubjectYearScoreInfo);
            }while (true);
            return(_SHSubjectYearScoreInfo);
        }
        private List<SHSubjectYearScoreInfo> GetPersonalYearSubjectScoreInfo(List<SHSubjectSemesterScoreInfo> pSHSubjectSemesterScoreInfo)
        {
            List<SHSubjectYearScoreInfo> _SHSubjectYearScoreInfo = new List<SHSubjectYearScoreInfo>();
            int i = -1;
            do
            {
                i++;
                SHSubjectSemesterScoreInfo _SHSubjectSemesterScoreInfo;

                if ((pSHSubjectSemesterScoreInfo.Count <= i))
                    break;

                _SHSubjectSemesterScoreInfo = pSHSubjectSemesterScoreInfo[i];

                string keySingleSubject = _SHSubjectSemesterScoreInfo.StudentID + "_" + _SHSubjectSemesterScoreInfo.SchoolYear.ToString() + "_" + _SHSubjectSemesterScoreInfo.SubjectName;

                SHSubjectYearScoreInfo pSHSubjectYearScoreInfo = this.GetPersonalSubjectYearScoreInfo(_SHSubjectSemesterScoreInfo.StudentID, _SHSubjectSemesterScoreInfo.SchoolYear, _SHSubjectSemesterScoreInfo.SubjectName, _SHSubjectSemesterScoreInfo.GradeYear);

                if (pSHSubjectYearScoreInfo == null)
                {
                    pSHSubjectYearScoreInfo = new SHSubjectYearScoreInfo();

                    pSHSubjectYearScoreInfo.StudentID = _SHSubjectSemesterScoreInfo.StudentID;
                    pSHSubjectYearScoreInfo.SchoolYear = _SHSubjectSemesterScoreInfo.SchoolYear;
                    pSHSubjectYearScoreInfo.SubjectName = _SHSubjectSemesterScoreInfo.SubjectName;
                    //pSHSubjectYearScoreInfo.Score = _SHSubjectSemesterScoreInfo
                    //pSHSubjectYearScoreInfo.Credit = _SHSubjectSemesterScoreInfo.StudentID;
                    pSHSubjectYearScoreInfo.GradeYear = _SHSubjectSemesterScoreInfo.GradeYear;
                    pSHSubjectYearScoreInfo.Hour = (_SHSubjectSemesterScoreInfo.Credit.HasValue ? _SHSubjectSemesterScoreInfo.Credit.Value + "" : string.Empty);
                }
                else
                {
                    pSHSubjectYearScoreInfo.AccumulatedCredit = 0;

                    decimal? creditSemester = 0;

                    pSHSubjectYearScoreInfo.AccumulatedCredit += (_SHSubjectSemesterScoreInfo.Credit.HasValue ? _SHSubjectSemesterScoreInfo.Credit.Value : 0);

                    if (_SHSubjectSemesterScoreInfo.Pass.HasValue)
                        if (_SHSubjectSemesterScoreInfo.Pass.Value)
                            creditSemester = (_SHSubjectSemesterScoreInfo.Credit.HasValue ? _SHSubjectSemesterScoreInfo.Credit.Value : 0);

                    pSHSubjectYearScoreInfo.Credit = creditSemester;
                    pSHSubjectYearScoreInfo.Hour = (_SHSubjectSemesterScoreInfo.Credit.HasValue ? _SHSubjectSemesterScoreInfo.Credit.Value + "" : string.Empty);
                }
                _SHSubjectYearScoreInfo.Add(pSHSubjectYearScoreInfo);
            }
            while (true);
            return _SHSubjectYearScoreInfo;
        }
        /// <summary>
        /// 由個人學期科目成績資訊取得個人學年科目成績資訊
        /// </summary>
        /// <param name="pSHSubject1stSemesterScoreInfo">個人上學期科目成績資訊</param>
        /// <param name="pSHSubject2ndSemesterScoreInfo">個人下學期科目成績資訊</param>
        /// <returns>個人學年科目成績資訊</returns>
        public List<SHSubjectYearScoreInfo> GetPersonalYearSubjectScoreInfo(Dictionary<int, List<SHSubjectSemesterScoreInfo>> dicSHSubjectSemesterScoreInfos)
        {
            List<SHSubjectSemesterScoreInfo> pSHSubject1stSemesterScoreInfo = new List<SHSubjectSemesterScoreInfo>();
            List<SHSubjectSemesterScoreInfo> pSHSubject2ndSemesterScoreInfo = new List<SHSubjectSemesterScoreInfo>();

            if (dicSHSubjectSemesterScoreInfos.ContainsKey(1))
                pSHSubject1stSemesterScoreInfo = dicSHSubjectSemesterScoreInfos[1];
            if (dicSHSubjectSemesterScoreInfos.ContainsKey(2))
                pSHSubject2ndSemesterScoreInfo = dicSHSubjectSemesterScoreInfos[2];

             if (pSHSubject1stSemesterScoreInfo.Count == 0 && pSHSubject2ndSemesterScoreInfo.Count == 0)
                return null;

            if (pSHSubject1stSemesterScoreInfo.Count == 0 && pSHSubject2ndSemesterScoreInfo.Count > 0)
                return this.GetPersonalYearSubjectScoreInfo(pSHSubject2ndSemesterScoreInfo);

            if (pSHSubject2ndSemesterScoreInfo.Count == 0 && pSHSubject1stSemesterScoreInfo.Count > 0)
                return this.GetPersonalYearSubjectScoreInfo(pSHSubject1stSemesterScoreInfo);

            List<SHSubjectYearScoreInfo> _SHSubjectYearScoreInfo = new List<SHSubjectYearScoreInfo>();

            int i = -1;
            do
            {
                i++;
                SHSubjectSemesterScoreInfo _SHSubjectSemesterScoreInfo;

                if ((pSHSubject1stSemesterScoreInfo.Count <= i) && (pSHSubject2ndSemesterScoreInfo.Count <= i))
                    break;

                //if (pSHSubject1stSemesterScoreInfo.Count > i)
                //    _SHSubjectSemesterScoreInfo = pSHSubject1stSemesterScoreInfo[i];
                //else
                //    _SHSubjectSemesterScoreInfo = pSHSubject2ndSemesterScoreInfo[i];

                if (pSHSubject2ndSemesterScoreInfo.Count > i)
                    _SHSubjectSemesterScoreInfo = pSHSubject2ndSemesterScoreInfo[i];
                else
                    _SHSubjectSemesterScoreInfo = pSHSubject1stSemesterScoreInfo[i];

                string keySingleSubject = _SHSubjectSemesterScoreInfo.StudentID + "_" + _SHSubjectSemesterScoreInfo.SchoolYear.ToString() + "_" + _SHSubjectSemesterScoreInfo.SubjectName;

                SHSubjectYearScoreInfo pSHSubjectYearScoreInfo = this.GetPersonalSubjectYearScoreInfo(_SHSubjectSemesterScoreInfo.StudentID, _SHSubjectSemesterScoreInfo.SchoolYear, _SHSubjectSemesterScoreInfo.SubjectName, _SHSubjectSemesterScoreInfo.GradeYear);

                if (pSHSubjectYearScoreInfo == null)
                {
                    if (pSHSubject1stSemesterScoreInfo.Count > i)
                        pSHSubjectYearScoreInfo = this.GetPersonalSubjectYearScoreInfo(pSHSubject1stSemesterScoreInfo[i].StudentID, pSHSubject1stSemesterScoreInfo[i].SchoolYear, pSHSubject1stSemesterScoreInfo[i].SubjectName, pSHSubject1stSemesterScoreInfo[i].GradeYear);
                    if (pSHSubjectYearScoreInfo == null)
                    {
                        if (pSHSubject1stSemesterScoreInfo.Count > i && pSHSubject2ndSemesterScoreInfo.Count > i)
                            pSHSubjectYearScoreInfo = this.GetPersonalSubjectYearScoreInfo(pSHSubject1stSemesterScoreInfo[i].StudentID, pSHSubject2ndSemesterScoreInfo[i].SchoolYear, pSHSubject1stSemesterScoreInfo[i].SubjectName, pSHSubject1stSemesterScoreInfo[i].GradeYear);
                        if (pSHSubjectYearScoreInfo == null)
                        {
                            pSHSubjectYearScoreInfo = new SHSubjectYearScoreInfo();

                            pSHSubjectYearScoreInfo.StudentID = _SHSubjectSemesterScoreInfo.StudentID;
                            pSHSubjectYearScoreInfo.SchoolYear = _SHSubjectSemesterScoreInfo.SchoolYear;
                            pSHSubjectYearScoreInfo.SubjectName = _SHSubjectSemesterScoreInfo.SubjectName;
                            //pSHSubjectYearScoreInfo.Score = _SHSubjectSemesterScoreInfo.Score;
                            //pSHSubjectYearScoreInfo.Credit = _SHSubjectSemesterScoreInfo.StudentID;
                            pSHSubjectYearScoreInfo.GradeYear = _SHSubjectSemesterScoreInfo.GradeYear;
                        }
                    }
                }
                //else
                //{
                    pSHSubjectYearScoreInfo.AccumulatedCredit = 0;

                    decimal? credit1stSemester = 0;
                    decimal? credit2ndSemester = 0;

                    if (pSHSubject1stSemesterScoreInfo.Count > i)
                    {
                        pSHSubjectYearScoreInfo.AccumulatedCredit += (pSHSubject1stSemesterScoreInfo[i].Credit.HasValue ? pSHSubject1stSemesterScoreInfo[i].Credit.Value : 0);
                        if (pSHSubject1stSemesterScoreInfo[i].Pass.HasValue)
                            if (pSHSubject1stSemesterScoreInfo[i].Pass.Value)
                                credit1stSemester = (pSHSubject1stSemesterScoreInfo[i].Credit.HasValue ? pSHSubject1stSemesterScoreInfo[i].Credit.Value : 0);
                        pSHSubjectYearScoreInfo.Hour = (pSHSubject1stSemesterScoreInfo[i].Credit.HasValue ? pSHSubject1stSemesterScoreInfo[i].Credit.Value + "" : string.Empty);
                    }

                    if (pSHSubject2ndSemesterScoreInfo.Count > i)
                    {
                        pSHSubjectYearScoreInfo.AccumulatedCredit += (pSHSubject2ndSemesterScoreInfo[i].Credit.HasValue ? pSHSubject2ndSemesterScoreInfo[i].Credit.Value : 0);
                        if (pSHSubject2ndSemesterScoreInfo[i].Pass.HasValue)
                            if (pSHSubject2ndSemesterScoreInfo[i].Pass.Value)
                                credit2ndSemester = (pSHSubject2ndSemesterScoreInfo[i].Credit.HasValue ? pSHSubject2ndSemesterScoreInfo[i].Credit.Value : 0);

                        decimal hour1st = 0;
                        decimal hour2nd = 0;

                        if (decimal.TryParse(pSHSubjectYearScoreInfo.Hour, out hour1st) && decimal.TryParse(pSHSubject2ndSemesterScoreInfo[i].Credit + "", out hour2nd))
                            pSHSubjectYearScoreInfo.Hour = (hour1st + hour2nd)/2 + "";
                        else if (!decimal.TryParse(pSHSubjectYearScoreInfo.Hour, out hour1st) && decimal.TryParse(pSHSubject2ndSemesterScoreInfo[i].Credit + "", out hour2nd))
                            pSHSubjectYearScoreInfo.Hour = (pSHSubject2ndSemesterScoreInfo[i].Credit.HasValue ? pSHSubject2ndSemesterScoreInfo[i].Credit.Value + "" : string.Empty);
                    }

                    pSHSubjectYearScoreInfo.Credit = credit1stSemester + credit2ndSemester;
                //}

                _SHSubjectYearScoreInfo.Add(pSHSubjectYearScoreInfo);
            }
            while (true);

            return _SHSubjectYearScoreInfo;
        }
        /// <summary>
        /// 由個人學期科目成績資訊取得個人學年科目成績資訊
        /// </summary>
        /// <param name="pSHSubject1stSemesterScoreInfo">個人上學期科目成績資訊</param>
        /// <param name="pSHSubject2ndSemesterScoreInfo">個人下學期科目成績資訊</param>
        /// <returns>個人學年科目成績資訊</returns>
        public List <SHSubjectYearScoreInfo> GetPersonalYearSubjectScoreInfo(Dictionary <int, List <SHSubjectSemesterScoreInfo> > dicSHSubjectSemesterScoreInfos)
        {
            List <SHSubjectSemesterScoreInfo> pSHSubject1stSemesterScoreInfo = new List <SHSubjectSemesterScoreInfo>();
            List <SHSubjectSemesterScoreInfo> pSHSubject2ndSemesterScoreInfo = new List <SHSubjectSemesterScoreInfo>();

            if (dicSHSubjectSemesterScoreInfos.ContainsKey(1))
            {
                pSHSubject1stSemesterScoreInfo = dicSHSubjectSemesterScoreInfos[1];
            }
            if (dicSHSubjectSemesterScoreInfos.ContainsKey(2))
            {
                pSHSubject2ndSemesterScoreInfo = dicSHSubjectSemesterScoreInfos[2];
            }

            if (pSHSubject1stSemesterScoreInfo.Count == 0 && pSHSubject2ndSemesterScoreInfo.Count == 0)
            {
                return(null);
            }

            if (pSHSubject1stSemesterScoreInfo.Count == 0 && pSHSubject2ndSemesterScoreInfo.Count > 0)
            {
                return(this.GetPersonalYearSubjectScoreInfo(pSHSubject2ndSemesterScoreInfo));
            }

            if (pSHSubject2ndSemesterScoreInfo.Count == 0 && pSHSubject1stSemesterScoreInfo.Count > 0)
            {
                return(this.GetPersonalYearSubjectScoreInfo(pSHSubject1stSemesterScoreInfo));
            }

            List <SHSubjectYearScoreInfo> _SHSubjectYearScoreInfo = new List <SHSubjectYearScoreInfo>();

            int i = -1;

            do
            {
                i++;
                SHSubjectSemesterScoreInfo _SHSubjectSemesterScoreInfo;

                if ((pSHSubject1stSemesterScoreInfo.Count <= i) && (pSHSubject2ndSemesterScoreInfo.Count <= i))
                {
                    break;
                }

                //if (pSHSubject1stSemesterScoreInfo.Count > i)
                //    _SHSubjectSemesterScoreInfo = pSHSubject1stSemesterScoreInfo[i];
                //else
                //    _SHSubjectSemesterScoreInfo = pSHSubject2ndSemesterScoreInfo[i];

                if (pSHSubject2ndSemesterScoreInfo.Count > i)
                {
                    _SHSubjectSemesterScoreInfo = pSHSubject2ndSemesterScoreInfo[i];
                }
                else
                {
                    _SHSubjectSemesterScoreInfo = pSHSubject1stSemesterScoreInfo[i];
                }

                string keySingleSubject = _SHSubjectSemesterScoreInfo.StudentID + "_" + _SHSubjectSemesterScoreInfo.SchoolYear.ToString() + "_" + _SHSubjectSemesterScoreInfo.SubjectName;

                SHSubjectYearScoreInfo pSHSubjectYearScoreInfo = this.GetPersonalSubjectYearScoreInfo(_SHSubjectSemesterScoreInfo.StudentID, _SHSubjectSemesterScoreInfo.SchoolYear, _SHSubjectSemesterScoreInfo.SubjectName, _SHSubjectSemesterScoreInfo.GradeYear);

                if (pSHSubjectYearScoreInfo == null)
                {
                    if (pSHSubject1stSemesterScoreInfo.Count > i)
                    {
                        pSHSubjectYearScoreInfo = this.GetPersonalSubjectYearScoreInfo(pSHSubject1stSemesterScoreInfo[i].StudentID, pSHSubject1stSemesterScoreInfo[i].SchoolYear, pSHSubject1stSemesterScoreInfo[i].SubjectName, pSHSubject1stSemesterScoreInfo[i].GradeYear);
                    }
                    if (pSHSubjectYearScoreInfo == null)
                    {
                        if (pSHSubject1stSemesterScoreInfo.Count > i && pSHSubject2ndSemesterScoreInfo.Count > i)
                        {
                            pSHSubjectYearScoreInfo = this.GetPersonalSubjectYearScoreInfo(pSHSubject1stSemesterScoreInfo[i].StudentID, pSHSubject2ndSemesterScoreInfo[i].SchoolYear, pSHSubject1stSemesterScoreInfo[i].SubjectName, pSHSubject1stSemesterScoreInfo[i].GradeYear);
                        }
                        if (pSHSubjectYearScoreInfo == null)
                        {
                            pSHSubjectYearScoreInfo = new SHSubjectYearScoreInfo();

                            pSHSubjectYearScoreInfo.StudentID   = _SHSubjectSemesterScoreInfo.StudentID;
                            pSHSubjectYearScoreInfo.SchoolYear  = _SHSubjectSemesterScoreInfo.SchoolYear;
                            pSHSubjectYearScoreInfo.SubjectName = _SHSubjectSemesterScoreInfo.SubjectName;
                            //pSHSubjectYearScoreInfo.Score = _SHSubjectSemesterScoreInfo.Score;
                            //pSHSubjectYearScoreInfo.Credit = _SHSubjectSemesterScoreInfo.StudentID;
                            pSHSubjectYearScoreInfo.GradeYear = _SHSubjectSemesterScoreInfo.GradeYear;
                        }
                    }
                }
                //else
                //{
                pSHSubjectYearScoreInfo.AccumulatedCredit = 0;

                decimal?credit1stSemester = 0;
                decimal?credit2ndSemester = 0;

                if (pSHSubject1stSemesterScoreInfo.Count > i)
                {
                    pSHSubjectYearScoreInfo.AccumulatedCredit += (pSHSubject1stSemesterScoreInfo[i].Credit.HasValue ? pSHSubject1stSemesterScoreInfo[i].Credit.Value : 0);
                    if (pSHSubject1stSemesterScoreInfo[i].Pass.HasValue)
                    {
                        if (pSHSubject1stSemesterScoreInfo[i].Pass.Value)
                        {
                            credit1stSemester = (pSHSubject1stSemesterScoreInfo[i].Credit.HasValue ? pSHSubject1stSemesterScoreInfo[i].Credit.Value : 0);
                        }
                    }
                    pSHSubjectYearScoreInfo.Hour = (pSHSubject1stSemesterScoreInfo[i].Credit.HasValue ? pSHSubject1stSemesterScoreInfo[i].Credit.Value + "" : string.Empty);
                }

                if (pSHSubject2ndSemesterScoreInfo.Count > i)
                {
                    pSHSubjectYearScoreInfo.AccumulatedCredit += (pSHSubject2ndSemesterScoreInfo[i].Credit.HasValue ? pSHSubject2ndSemesterScoreInfo[i].Credit.Value : 0);
                    if (pSHSubject2ndSemesterScoreInfo[i].Pass.HasValue)
                    {
                        if (pSHSubject2ndSemesterScoreInfo[i].Pass.Value)
                        {
                            credit2ndSemester = (pSHSubject2ndSemesterScoreInfo[i].Credit.HasValue ? pSHSubject2ndSemesterScoreInfo[i].Credit.Value : 0);
                        }
                    }

                    decimal hour1st = 0;
                    decimal hour2nd = 0;

                    if (decimal.TryParse(pSHSubjectYearScoreInfo.Hour, out hour1st) && decimal.TryParse(pSHSubject2ndSemesterScoreInfo[i].Credit + "", out hour2nd))
                    {
                        pSHSubjectYearScoreInfo.Hour = (hour1st + hour2nd) / 2 + "";
                    }
                    else if (!decimal.TryParse(pSHSubjectYearScoreInfo.Hour, out hour1st) && decimal.TryParse(pSHSubject2ndSemesterScoreInfo[i].Credit + "", out hour2nd))
                    {
                        pSHSubjectYearScoreInfo.Hour = (pSHSubject2ndSemesterScoreInfo[i].Credit.HasValue ? pSHSubject2ndSemesterScoreInfo[i].Credit.Value + "" : string.Empty);
                    }
                }

                pSHSubjectYearScoreInfo.Credit = credit1stSemester + credit2ndSemester;
                //}

                _SHSubjectYearScoreInfo.Add(pSHSubjectYearScoreInfo);
            }while (true);

            return(_SHSubjectYearScoreInfo);
        }