コード例 #1
0
        private Dictionary <int, SpojProblemInfoModel> ParseProblems(SpojDataTokenizer tokenizer)
        {
            var prolems   = new Dictionary <int, SpojProblemInfoModel>();
            var nProblems = tokenizer.GetInt();
            var nLines    = tokenizer.GetInt();

            var listCheckingIds = new List <int>();

            var listChunk  = new List <SpojProblemInfoModel>();
            var chunkSteps = (int)Math.Ceiling((double)nProblems / _chunkSize);

            for (int i = 0; i < chunkSteps; i++)
            {
                for (int j = i * _chunkSize; j < (i + 1) * _chunkSize && j < nProblems; j++)
                {
                    var problemModel = new SpojProblemInfoModel()
                    {
                        Id         = tokenizer.GetInt(),
                        TimeLimit  = tokenizer.GetFloat(),
                        Code       = tokenizer.GetNext(),
                        Name       = tokenizer.GetNext(),
                        Type       = tokenizer.GetInt(),
                        ProblemSet = tokenizer.GetNext()
                    };

                    listChunk.Add(problemModel);
                    listCheckingIds.Add(problemModel.Id);

                    tokenizer.Skip(nLines - 6);
                    prolems[problemModel.Id] = problemModel;
                }

                var ids = listCheckingIds;

                var        listIdsCache    = _problemCacheBusiness.GetIds();
                List <int> listNonExisting = new List <int>();
                foreach (var id in listCheckingIds)
                {
                    if (!listIdsCache.Contains(id))
                    {
                        listNonExisting.Add(id);
                    }
                }

                var listEntitties = listChunk.Where(x => listNonExisting.Contains(x.Id)).Select(model => new ProblemEntity
                {
                    SpojId         = model.Id,
                    TimeLimit      = model.TimeLimit,
                    Code           = model.Code,
                    Name           = model.Name,
                    Type           = model.Type,
                    SpojProblemSet = model.ProblemSet
                })
                                    .ToList();

                _problemRepository.InsertRange(listEntitties);
                _problemRepository.SaveChanges();
                listChunk       = new List <SpojProblemInfoModel>();
                listCheckingIds = new List <int>();
                _problemCacheBusiness.AddRangeIds(listNonExisting);
            }
            _problemRepository.SaveChanges();


            return(prolems);
        }