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); }