/// <summary>
        /// 毫米轉換為米分米釐米毫米
        /// </summary>
        /// <param name="formula">計算式作成</param>
        /// <param name="type">填空項目選擇(毫米或者米分米釐米毫米)</param>
        protected virtual void MillimeterConvertToMeterDecimetreCentimeterExt(LearnLengthUnitFormula formula, QuestionType type)
        {
            // 隨機取得米數量級
            int meter = CommonUtil.GetRandomNumber(1, 9);
            // 隨機取得分米數量級
            int decimetre = CommonUtil.GetRandomNumber(1, 9);
            // 隨機取得釐米數量級
            int centimeter = CommonUtil.GetRandomNumber(1, 9);
            // 隨機取得釐米數量級
            int remainderMillimeter = CommonUtil.GetRandomNumber(1, 9);
            // 隨機編排填空項目(是毫米還是米分米釐米毫米)
            GapFilling gap = GetRandomGapFilling(type);

            // 結果對象設置并返回
            formula.LengthUnitItme = new LengthUnit()
            {
                // 毫米單位
                Millimeter = meter * 1000 + decimetre * 100 + centimeter * 10 + remainderMillimeter,
                // 米單位
                Meter = meter,
                // 分米單位
                Decimetre = decimetre,
                // 釐米單位
                Centimeter = centimeter
            };
            // 剩餘的毫米
            formula.RemainderMillimeter = remainderMillimeter;
            // 填空項目(毫米或者米分米釐米毫米)
            formula.Gap = gap;
        }
        /// <summary>
        /// 返回毫米單位的HTML信息
        /// </summary>
        /// <param name="item">題型輸出結果</param>
        /// <param name="controlIndex">輸入框控件ID(主)</param>
        /// <param name="isInput">是否為可輸入項目</param>
        /// <param name="childIndex">輸入框控件ID(子)</param>
        /// <returns>HTML信息</returns>
        private string GetMillimeterHtml(LearnLengthUnitFormula item, int controlIndex, bool isInput, string childIndex = "S0")
        {
            StringBuilder html = new StringBuilder();

            if (isInput)
            {
                _answers.AppendFormat("{0};", Base64.EncodeBase64(item.LengthUnitItme.Millimeter.Value.ToString()));
                html.AppendFormat(INPUT_HTML_FORMAT, controlIndex, childIndex).AppendLine(string.Format(UNIT_HTML_FORMAT, Consts.MILLIMETER_UNIT));
            }
            else
            {
                html.AppendFormat(SPAN_HTML_FORMAT, item.LengthUnitItme.Millimeter).AppendLine(string.Format(UNIT_HTML_FORMAT, Consts.MILLIMETER_UNIT));
            }

            return(html.ToString());
        }
        /// <summary>
        /// 返回分米單位的HTML信息
        /// </summary>
        /// <param name="item">題型輸出結果</param>
        /// <param name="controlIndex">輸入框控件ID(主)</param>
        /// <param name="isInput">是否為可輸入項目</param>
        /// <param name="childIndex">輸入框控件ID(子)</param>
        /// <returns>HTML信息</returns>
        private string GetRemainderDecimetreHtml(LearnLengthUnitFormula item, int controlIndex, bool isInput, string childIndex = "S0")
        {
            StringBuilder html = new StringBuilder();

            if (isInput)
            {
                _answers.AppendFormat("{0};", Base64.EncodeBase64(item.RemainderDecimetre.Value.ToString()));
                html.AppendFormat(INPUT_HTML_FORMAT, controlIndex, childIndex).AppendLine(string.Format(UNIT_HTML_FORMAT, Consts.DECIMETRE_UNIT));
            }
            else
            {
                // 考慮剩餘分米的輸出
                html.AppendFormat(SPAN_HTML_FORMAT, item.RemainderDecimetre.Value).AppendLine(string.Format(UNIT_HTML_FORMAT, Consts.DECIMETRE_UNIT));
            }

            return(html.ToString());
        }
        /// <summary>
        /// 毫米轉換為釐米
        /// </summary>
        /// <param name="formula">計算式作成</param>
        /// <param name="type">填空項目選擇(毫米或者釐米)</param>
        protected virtual void MillimeterConvertToCentimeter(LearnLengthUnitFormula formula, QuestionType type)
        {
            // 隨機取得釐米數量級
            int centimeter = CommonUtil.GetRandomNumber(1, 10);
            // 隨機編排填空項目(是毫米還是釐米)
            GapFilling gap = GetRandomGapFilling(type);

            // 結果對象設置并返回
            formula.LengthUnitItme = new LengthUnit()
            {
                // 毫米單位
                Millimeter = centimeter * 10,
                // 釐米單位
                Centimeter = centimeter
            };
            // 填空項目(毫米或者釐米)
            formula.Gap = gap;
        }
        /// <summary>
        /// 毫米轉換為分米
        /// </summary>
        /// <param name="formula">計算式作成</param>
        /// <param name="type">填空項目選擇(毫米或者分米)</param>
        protected virtual void MillimeterConvertToDecimetre(LearnLengthUnitFormula formula, QuestionType type)
        {
            // 隨機取得分米數量級
            int decimetre = CommonUtil.GetRandomNumber(1, 10);
            // 隨機編排填空項目(是毫米還是分米)
            GapFilling gap = GetRandomGapFilling(type);

            // 結果對象設置并返回
            formula.LengthUnitItme = new LengthUnit()
            {
                // 毫米單位
                Millimeter = decimetre * 100,
                // 分米單位
                Decimetre = decimetre
            };
            // 填空項目(毫米或者分米)
            formula.Gap = gap;
        }
        /// <summary>
        /// 釐米轉換為分米
        /// </summary>
        /// <param name="formula">計算式作成</param>
        /// <param name="type">填空項目選擇(釐米或者分米)</param>
        protected virtual void CentimeterConvertToDecimetre(LearnLengthUnitFormula formula, QuestionType type)
        {
            // 隨機取得釐米數量級
            int centimeter = CommonUtil.GetRandomNumber(1, 10) * 10;
            // 轉換為分米的換算
            int decimetre = centimeter / 10;
            // 隨機編排填空項目(是釐米還是分米)
            GapFilling gap = GetRandomGapFilling(type);

            // 結果對象設置并返回
            formula.LengthUnitItme = new LengthUnit()
            {
                // 釐米單位
                Centimeter = centimeter,
                // 分米單位
                Decimetre = decimetre
            };
            // 填空項目(釐米或者分米)
            formula.Gap = gap;
        }
        /// <summary>
        /// 分米轉換為毫米
        /// </summary>
        /// <param name="formula">計算式作成</param>
        /// <param name="type">填空項目選擇(分米或者毫米)</param>
        protected virtual void DecimetreConvertToMillimeter(LearnLengthUnitFormula formula, QuestionType type)
        {
            // 隨機取得分米數量級
            int decimetre = CommonUtil.GetRandomNumber(1, 10);
            // 轉換為毫米的換算
            int millimeter = decimetre * 100;
            // 隨機編排填空項目(是分米還是毫米)
            GapFilling gap = GetRandomGapFilling(type);

            // 結果對象設置并返回
            formula.LengthUnitItme = new LengthUnit()
            {
                // 分米單位
                Decimetre = decimetre,
                // 毫米單位
                Millimeter = millimeter
            };
            // 填空項目(分米或者毫米)
            formula.Gap = gap;
        }
        /// <summary>
        /// 分米到釐米
        /// </summary>
        /// <param name="formula">計算式作成</param>
        /// <param name="type">填空項目選擇(米或者釐米)</param>
        protected virtual void DecimetreConvertToCentimeter(LearnLengthUnitFormula formula, QuestionType type)
        {
            // 隨機取得分米數量級
            int decimetre = CommonUtil.GetRandomNumber(1, 10);
            // 轉換為釐米的換算
            int entimeter = decimetre * 10;
            // 隨機編排填空項目(是釐米還是分米)
            GapFilling gap = GetRandomGapFilling(type);

            // 結果對象設置并返回
            formula.LengthUnitItme = new LengthUnit()
            {
                // 分米單位
                Decimetre = decimetre,
                // 釐米單位
                Centimeter = entimeter
            };
            // 填空項目(米或者釐米)
            formula.Gap = gap;
        }
        /// <summary>
        /// 算式作成
        /// </summary>
        /// <param name="p">題型參數</param>
        /// <param name="lengthUnitFunc">運算符取得用的表達式</param>
        private void MarkFormulaList(LearnLengthUnitParameter p, Func <LengthUnitTransformType> lengthUnitFunc)
        {
            // 當前反推判定次數(一次推算內次數累加)
            int defeated = 0;

            // 按照指定數量作成相應的數學計算式
            for (var i = 0; i < p.NumberOfQuestions; i++)
            {
                // 單一的長度轉換類型
                LengthUnitTransformType type = lengthUnitFunc();

                LearnLengthUnitFormula formula = new LearnLengthUnitFormula()
                {
                    LengthUnitTransType = type
                };
                if (_currencys.TryGetValue(type, out Action <LearnLengthUnitFormula, QuestionType> currency))
                {
                    currency(formula, p.QuestionType);
                }
                else
                {
                    throw new ArgumentException(MessageUtil.GetMessage(() => MsgResources.E0001L, type.ToString()));
                }

                if (CheckIsNeedInverseMethod(p.Formulas, formula))
                {
                    defeated++;
                    // 如果大於兩次則認為此題無法作成繼續下一題
                    if (defeated == INVERSE_NUMBER)
                    {
                        // 當前反推判定次數復原
                        defeated = 0;
                        continue;
                    }
                    i--;
                    continue;
                }
                p.Formulas.Add(formula);
            }
        }
        /// <summary>
        /// 分米到米分米
        /// </summary>
        /// <param name="formula">計算式作成</param>
        /// <param name="type">填空項目選擇(分米或者米分米)</param>
        protected virtual void DecimetreConvertToMeterExt(LearnLengthUnitFormula formula, QuestionType type)
        {
            // 隨機取得米數量級
            int meter = CommonUtil.GetRandomNumber(1, 9);
            // 隨機取得分米數量級
            int remainderDecimetre = CommonUtil.GetRandomNumber(1, 9);
            // 隨機編排填空項目(是分米還是米分米)
            GapFilling gap = GetRandomGapFilling(type);

            // 結果對象設置并返回
            formula.LengthUnitItme = new LengthUnit()
            {
                // 分米單位
                Decimetre = meter * 10 + remainderDecimetre,
                // 米單位
                Meter = meter
            };
            // 剩餘的分米
            formula.RemainderDecimetre = remainderDecimetre;
            // 填空項目(分米或者米、分米)
            formula.Gap = gap;
        }
        /// <summary>
        /// 分米到米釐米
        /// </summary>
        /// <param name="formula">計算式作成</param>
        /// <param name="type">填空項目選擇(分米或者米釐米)</param>
        protected virtual void DecimetreConvertToMeterCentimeter(LearnLengthUnitFormula formula, QuestionType type)
        {
            // 隨機取得分米數量級
            int decimetre = CommonUtil.GetRandomNumber(11, 99);
            // 轉換為米的換算
            int meter = decimetre / 10;
            // 轉換為釐米的換算
            int centimeter = decimetre % 10 * 10;
            // 隨機編排填空項目(是分米還是米分米)
            GapFilling gap = GetRandomGapFilling(type);

            // 結果對象設置并返回
            formula.LengthUnitItme = new LengthUnit()
            {
                // 分米單位
                Decimetre = decimetre,
                // 米單位
                Meter = meter,
                // 釐米單位
                Centimeter = centimeter
            };
            // 填空項目(分米或者米、釐米)
            formula.Gap = gap;
        }
 /// <summary>
 /// 判定是否需要反推并重新作成計算式
 /// </summary>
 /// <remarks>
 /// 情況1:完全一致
 /// </remarks>
 /// <param name="preFormulas">已得到的算式</param>
 /// <param name="currentFormula">當前算式</param>
 /// <returns>需要反推:true  正常情況: false</returns>
 private bool CheckIsNeedInverseMethod(IList <LearnLengthUnitFormula> preFormulas, LearnLengthUnitFormula currentFormula)
 {
     // 判斷當前算式是否已經出現過
     if (preFormulas.ToList().Any(d => d.LengthUnitItme.Meter == currentFormula.LengthUnitItme.Meter &&
                                  d.LengthUnitItme.Decimetre == currentFormula.LengthUnitItme.Decimetre &&
                                  d.LengthUnitItme.Centimeter == currentFormula.LengthUnitItme.Centimeter &&
                                  d.LengthUnitItme.Millimeter == currentFormula.LengthUnitItme.Millimeter &&
                                  d.LengthUnitTransType == currentFormula.LengthUnitTransType))
     {
         return(true);
     }
     return(false);
 }
        /// <summary>
        /// 根據題型輸出結果作成HTML模板信息
        /// </summary>
        /// <param name="item">題型輸出結果</param>
        /// <param name="controlIndex">輸入框控件ID</param>
        /// <returns>HTML模板信息</returns>
        private string GetHtml(LearnLengthUnitFormula item, int controlIndex)
        {
            _answers.Length = 0;
            StringBuilder html = new StringBuilder();

            switch (item.LengthUnitTransType)
            {
            // 米到分米
            case LengthUnitTransformType.M2D:
                html.Append(GetMeterHtml(item, controlIndex, (item.Gap == GapFilling.Left)));
                html.AppendLine(EQUALTO_HTML);
                html.Append(GetDecimetreHtml(item, controlIndex, !(item.Gap == GapFilling.Left)));
                break;

            // 米到釐米
            case LengthUnitTransformType.M2C:
                html.Append(GetMeterHtml(item, controlIndex, (item.Gap == GapFilling.Left)));
                html.AppendLine(EQUALTO_HTML);
                html.Append(GetCentimeterHtml(item, controlIndex, !(item.Gap == GapFilling.Left)));
                break;

            // 米到毫米
            case LengthUnitTransformType.M2MM:
                html.Append(GetMeterHtml(item, controlIndex, (item.Gap == GapFilling.Left)));
                html.AppendLine(EQUALTO_HTML);
                html.Append(GetMillimeterHtml(item, controlIndex, !(item.Gap == GapFilling.Left)));
                break;

            // 分米到米
            case LengthUnitTransformType.D2M:
                html.Append(GetDecimetreHtml(item, controlIndex, (item.Gap == GapFilling.Left)));
                html.AppendLine(EQUALTO_HTML);
                html.Append(GetMeterHtml(item, controlIndex, !(item.Gap == GapFilling.Left)));
                break;

            // 分米到釐米
            case LengthUnitTransformType.D2C:
                html.Append(GetDecimetreHtml(item, controlIndex, (item.Gap == GapFilling.Left)));
                html.AppendLine(EQUALTO_HTML);
                html.Append(GetCentimeterHtml(item, controlIndex, !(item.Gap == GapFilling.Left)));
                break;

            // 分米到毫米
            case LengthUnitTransformType.D2MM:
                html.Append(GetDecimetreHtml(item, controlIndex, (item.Gap == GapFilling.Left)));
                html.AppendLine(EQUALTO_HTML);
                html.Append(GetMillimeterHtml(item, controlIndex, !(item.Gap == GapFilling.Left)));
                break;

            // 分米到米分米(有剩餘)
            case LengthUnitTransformType.D2MExt:
                html.Append(GetDecimetreHtml(item, controlIndex, (item.Gap == GapFilling.Left)));
                html.AppendLine(EQUALTO_HTML);
                html.Append(GetMeterHtml(item, controlIndex, !(item.Gap == GapFilling.Left)));
                html.Append(GetRemainderDecimetreHtml(item, controlIndex, !(item.Gap == GapFilling.Left), "S1"));
                break;

            // 分米到米釐米
            case LengthUnitTransformType.D2MC:
                html.Append(GetDecimetreHtml(item, controlIndex, (item.Gap == GapFilling.Left)));
                html.AppendLine(EQUALTO_HTML);
                html.Append(GetMeterHtml(item, controlIndex, !(item.Gap == GapFilling.Left)));
                html.Append(GetCentimeterHtml(item, controlIndex, !(item.Gap == GapFilling.Left), "S1"));
                break;

            // 釐米到米
            case LengthUnitTransformType.C2M:
                html.Append(GetCentimeterHtml(item, controlIndex, (item.Gap == GapFilling.Left)));
                html.AppendLine(EQUALTO_HTML);
                html.Append(GetMeterHtml(item, controlIndex, !(item.Gap == GapFilling.Left)));
                break;

            // 釐米到分米
            case LengthUnitTransformType.C2D:
                html.Append(GetCentimeterHtml(item, controlIndex, (item.Gap == GapFilling.Left)));
                html.AppendLine(EQUALTO_HTML);
                html.Append(GetDecimetreHtml(item, controlIndex, !(item.Gap == GapFilling.Left)));
                break;

            // 釐米到毫米
            case LengthUnitTransformType.C2MM:
                html.Append(GetCentimeterHtml(item, controlIndex, (item.Gap == GapFilling.Left)));
                html.AppendLine(EQUALTO_HTML);
                html.Append(GetMillimeterHtml(item, controlIndex, !(item.Gap == GapFilling.Left)));
                break;

            // 釐米到米分米
            case LengthUnitTransformType.C2MD:
                html.Append(GetCentimeterHtml(item, controlIndex, (item.Gap == GapFilling.Left)));
                html.AppendLine(EQUALTO_HTML);
                html.Append(GetMeterHtml(item, controlIndex, !(item.Gap == GapFilling.Left)));
                html.Append(GetDecimetreHtml(item, controlIndex, !(item.Gap == GapFilling.Left), "S1"));
                break;

            // 釐米到分米毫米
            case LengthUnitTransformType.C2DMM:
                html.Append(GetCentimeterHtml(item, controlIndex, (item.Gap == GapFilling.Left)));
                html.AppendLine(EQUALTO_HTML);
                html.Append(GetDecimetreHtml(item, controlIndex, !(item.Gap == GapFilling.Left)));
                html.Append(GetMillimeterHtml(item, controlIndex, !(item.Gap == GapFilling.Left), "S1"));
                break;

            // 釐米到米分米釐米(有剩餘)
            case LengthUnitTransformType.C2MDExt:
                html.Append(GetCentimeterHtml(item, controlIndex, (item.Gap == GapFilling.Left)));
                html.AppendLine(EQUALTO_HTML);
                html.Append(GetMeterHtml(item, controlIndex, !(item.Gap == GapFilling.Left)));
                html.Append(GetDecimetreHtml(item, controlIndex, !(item.Gap == GapFilling.Left), "S1"));
                html.Append(GetRemainderCentimeterHtml(item, controlIndex, !(item.Gap == GapFilling.Left), "S2"));
                break;

            // 毫米到分米
            case LengthUnitTransformType.MM2D:
                html.Append(GetMillimeterHtml(item, controlIndex, (item.Gap == GapFilling.Left)));
                html.AppendLine(EQUALTO_HTML);
                html.Append(GetDecimetreHtml(item, controlIndex, !(item.Gap == GapFilling.Left)));
                break;

            // 毫米到釐米
            case LengthUnitTransformType.MM2C:
                html.Append(GetMillimeterHtml(item, controlIndex, (item.Gap == GapFilling.Left)));
                html.AppendLine(EQUALTO_HTML);
                html.Append(GetCentimeterHtml(item, controlIndex, !(item.Gap == GapFilling.Left)));
                break;

            // 毫米到米
            case LengthUnitTransformType.MM2M:
                html.Append(GetMillimeterHtml(item, controlIndex, (item.Gap == GapFilling.Left)));
                html.AppendLine(EQUALTO_HTML);
                html.Append(GetMeterHtml(item, controlIndex, !(item.Gap == GapFilling.Left)));
                break;

            // 毫米到米分米
            case LengthUnitTransformType.MM2MD:
                html.Append(GetMillimeterHtml(item, controlIndex, (item.Gap == GapFilling.Left)));
                html.AppendLine(EQUALTO_HTML);
                html.Append(GetMeterHtml(item, controlIndex, !(item.Gap == GapFilling.Left)));
                html.Append(GetDecimetreHtml(item, controlIndex, !(item.Gap == GapFilling.Left), "S1"));
                break;

            // 毫米到米分米釐米
            case LengthUnitTransformType.MM2MDC:
                html.Append(GetMillimeterHtml(item, controlIndex, (item.Gap == GapFilling.Left)));
                html.AppendLine(EQUALTO_HTML);
                html.Append(GetMeterHtml(item, controlIndex, !(item.Gap == GapFilling.Left)));
                html.Append(GetDecimetreHtml(item, controlIndex, !(item.Gap == GapFilling.Left), "S1"));
                html.Append(GetCentimeterHtml(item, controlIndex, !(item.Gap == GapFilling.Left), "S2"));
                break;

            // 毫米到分米釐米
            case LengthUnitTransformType.MM2DC:
                html.Append(GetMillimeterHtml(item, controlIndex, (item.Gap == GapFilling.Left)));
                html.AppendLine(EQUALTO_HTML);
                html.Append(GetDecimetreHtml(item, controlIndex, !(item.Gap == GapFilling.Left)));
                html.Append(GetCentimeterHtml(item, controlIndex, !(item.Gap == GapFilling.Left), "S1"));
                break;

            // 毫米到米釐米
            case LengthUnitTransformType.MM2MC:
                html.Append(GetMillimeterHtml(item, controlIndex, (item.Gap == GapFilling.Left)));
                html.AppendLine(EQUALTO_HTML);
                html.Append(GetMeterHtml(item, controlIndex, !(item.Gap == GapFilling.Left)));
                html.Append(GetCentimeterHtml(item, controlIndex, !(item.Gap == GapFilling.Left), "S1"));
                break;

            // 毫米到米分米釐米毫米(有剩餘)
            case LengthUnitTransformType.MM2MDCExt:
                html.Append(GetMillimeterHtml(item, controlIndex, (item.Gap == GapFilling.Left)));
                html.AppendLine(EQUALTO_HTML);
                html.Append(GetMeterHtml(item, controlIndex, !(item.Gap == GapFilling.Left)));
                html.Append(GetDecimetreHtml(item, controlIndex, !(item.Gap == GapFilling.Left), "S1"));
                html.Append(GetCentimeterHtml(item, controlIndex, !(item.Gap == GapFilling.Left), "S2"));
                html.Append(GetRemainderMillimeterHtml(item, controlIndex, !(item.Gap == GapFilling.Left), "S3"));
                break;
            }

            // 答案列表
            _answers.Length -= 1;
            html.AppendLine(string.Format("<input id=\"hidLluAnswer{0}\" type=\"hidden\" value=\"{1}\" />", controlIndex, _answers.ToString()));

            return(html.ToString());
        }