public bool CheckWinNumbers(ISportAnteCode[] antecodeList, ISportResult[] winNumberList, out string errMsg)
        {
            PreconditionAssert.IsTrue((winNumberList != null && winNumberList.Length > 0), "必须传入比赛结果");

            //if (winNumberList.Length != winNumberList.GroupBy(a => a.GetMatchId(GameCode)).Count())
            //{
            //    errMsg = "比赛场次重复";
            //    return false;
            //}
            foreach (var code in winNumberList)
            {
                var ante = antecodeList.FirstOrDefault(a => a.MatchId == code.GetMatchId(GameCode));
                if (ante != null)
                {
                    var orderAnalyzer = AnalyzerFactory.GetSportAnteCodeChecker(GameCode, GameType);
                    if (!orderAnalyzer.CheckWinNumber(code, ante.GameType, out errMsg))
                    {
                        return(false);
                    }
                }
            }

            errMsg = "";
            return(true);
        }
        /// <summary>
        /// 检查中奖号码格式是否正确
        /// </summary>
        /// <param name="winNumber">中奖号码</param>
        /// <param name="gameType">玩法</gameType>
        /// <param name="errMsg">错误消息</param>
        /// <returns>格式是否正确</returns>
        public bool CheckWinNumber(ISportResult winNumber, string gameType, out string errMsg)
        {
            if (!string.IsNullOrEmpty(gameType) && gameType != GameType)
            {
                var orderAnalyzer = AnalyzerFactory.GetSportAnteCodeChecker(GameCode, gameType);
                return(orderAnalyzer.CheckWinNumber(winNumber, null, out errMsg));
            }
            else
            {
                // 前置验证 - 彩种、玩法、投注号码
                PreconditionAssert.IsNotEmptyString(GameCode, "检查中奖号码格式前,必须设置彩种");
                PreconditionAssert.IsNotNull(winNumber, "必须传入非空的比赛结果");
                PreconditionAssert.IsNotEmptyString(winNumber.GetMatchId(GameCode), "必须传入比赛编号");

                _winNumbers = EffectiveWinNumber.Split(Spliter);
                var result = winNumber.GetMatchResult(GameCode, GameType);
                if (result != CancelMatchResultFlag && !_winNumbers.Contains(result))
                {
                    errMsg = string.Format("错误的比赛结果格式,允许的格式:{0},取消结果格式:{1},实际为:'{2}'.", EffectiveWinNumber, CancelMatchResultFlag, result);
                    return(false);
                }
                errMsg = "";
                return(true);
            }
        }
        public bool CheckAntecode(ISportAnteCode[] antecodeList, out string errMsg)
        {
            // 前置验证 - 彩种、玩法、投注号码
            PreconditionAssert.IsNotEmptyString(GameCode, "检查投注号码格式前,必须设置彩种");
            PreconditionAssert.IsNotEmptyString(GameType, "检查投注号码格式前,必须设置玩法");
            PreconditionAssert.IsTrue((antecodeList != null && antecodeList.Length > 0), "必须传入投注号码");

            //if (antecodeList.Length != antecodeList.GroupBy(a => a.MatchId).Count())
            //{
            //    errMsg = "选择的比赛场次重复";
            //    return false;
            //}
            if (antecodeList.Length != antecodeList.GroupBy(a => new { MatchId = a.MatchId, GameType = a.GameType }).Count())
            {
                errMsg = "选择的比赛场次重复";
                return(false);
            }
            if (antecodeList.Length < BaseCount)
            {
                errMsg = "选择的比赛不够,当前串关方式至少需要 " + BaseCount + "场比赛";
                return(false);
            }
            TuoNumbers = antecodeList.Where(a => !a.IsDan).ToArray();
            DanNumbers = antecodeList.Where(a => a.IsDan).ToArray();
            if (DanNumbers.Length > BaseCount)
            {
                errMsg = "胆码太多,当前串关方式最多允许 " + BaseCount + "个胆码";
                return(false);
            }
            foreach (var code in antecodeList)
            {
                var type          = string.IsNullOrEmpty(code.GameType) ? GameType : code.GameType;
                var orderAnalyzer = AnalyzerFactory.GetSportAnteCodeChecker(GameCode, type);
                if (!orderAnalyzer.CheckAntecodeNumber(code, out errMsg))
                {
                    return(false);
                }
            }

            errMsg = "";
            return(true);
        }