Рефакторинг WorkOperationDetection избавился от двух циклов внутри метода Action

This commit is contained in:
Степанов Дмитрий 2024-02-21 07:29:01 +03:00
parent 3e84b1591f
commit 615771395d

View File

@ -1,5 +1,4 @@
using System; using System;
using System.Collections.Generic;
using System.Diagnostics; using System.Diagnostics;
using System.Linq; using System.Linq;
using System.Threading; using System.Threading;
@ -34,31 +33,19 @@ public class WorkOperationDetection: Work
var detectedOperationService = services.GetRequiredService<IDetectedOperationService>(); var detectedOperationService = services.GetRequiredService<IDetectedOperationService>();
var telemetryIds = (await telemetryRepository.GetAllAsync(token)) var telemetryIds = (await telemetryRepository.GetAllAsync(token))
.Select(t => t.Id); .Select(t => t.Id)
.ToArray();
var lastDetectedDates = await detectedOperationRepository.GetLastDetectedDatesAsync(token); var lastDetectedDates = await detectedOperationRepository.GetLastDetectedDatesAsync(token);
var beginDatesDetectOperations = new List<(int TelemetryId, DateTimeOffset? BeginDate)>(); for (var i = 0; i < telemetryIds.Length; i++)
foreach (var telemetryId in telemetryIds)
{ {
if (lastDetectedDates.TryGetValue(telemetryId, out var beginDate)) var telemetryId = telemetryIds[i];
{
beginDatesDetectOperations.Add((telemetryId, beginDate));
continue;
}
beginDatesDetectOperations.Add((telemetryId, null)); var beginDate = lastDetectedDates.TryGetValue(telemetryId, out var date) ? date : (DateTimeOffset?)null;
}
var count = beginDatesDetectOperations.Count;
for (var i = 0; i < count; i++)
{
var (idTelemetry, beginDate) = beginDatesDetectOperations[i];
onProgressCallback($"Start detecting telemetry: {idTelemetry} from {beginDate}", i++ / count); onProgressCallback($"Start detecting telemetry: {telemetryId} from {beginDate}", i++ / telemetryIds.Length);
var detectedOperations = await detectedOperationService.DetectOperationsAsync(idTelemetry, beginDate, token); var detectedOperations = await detectedOperationService.DetectOperationsAsync(telemetryId, beginDate, token);
if (detectedOperations.Any()) if (detectedOperations.Any())
await detectedOperationRepository.InsertRangeAsync(detectedOperations, token); await detectedOperationRepository.InsertRangeAsync(detectedOperations, token);