/// <summary> /// Search /// </summary> private async void buttonSearch_Click_1(object sender, EventArgs e) { if (!CheckInputData()) return; if (logElements == null) { Log("Please select correct log file."); return; } foreach (var mainSign in mainSigns) { // Время начала берется из названия файла, а длительность - длительность файла DateTime timeBegin; if (!TrySignNameAsDateTime(mainSign.ToString(), out timeBegin)) { Log("Error: Cannot recognize time stamp in filename " + mainSign.ToString()); continue; } TimeInterval mainInterval = new TimeInterval(timeBegin, mainSign.ToTimeSpan()); Log(String.Format("Search on {0} ({1}):", mainSign.ToString(), mainSign.ToTimeSpan())); // Перебираем все записи из этого интервала List<LogElement> _elems = logElements.Where((logElement) => { if (mainInterval.Within(new TimeInterval(logElement.Begin, logElement.Length))) { Log(logElement.ToString()); return true; } return false; }).ToList(); Log(String.Format("{0} elements on time interval {1}", _elems.Count, mainInterval.ToString())); if (_elems.Count < 1) continue; // Сопоставляем каждой записи сигнатуру List<Signature> _signs = new List<Signature>(); List<LogElement> _notFoundElems = new List<LogElement>(); foreach (var elem in _elems) { try { _signs.Add(dictSigns[elem.ElemName]); } catch (KeyNotFoundException) { _notFoundElems.Add(elem); } } // Выводим информацию об этом StringBuilder sb = new StringBuilder(); sb.AppendFormat("Got {0}/{1} files.", _signs.Count, _elems.Count); if (_notFoundElems.Count > 0) { sb.Append(" Not found: " + Environment.NewLine); foreach (var elem in _notFoundElems) sb.AppendLine(elem.ToString()); } else sb.AppendLine(); Log(sb.ToString()); // Сравниваем Congruence[] _congs = await CompareParallel(mainSign, _signs.Distinct().ToArray()); // Обрабатываем результаты сравнения float[] dtime = new float[_elems.Count]; for (int i = 0; i < _elems.Count; i++) dtime[i] = float.NaN; if (_congs != null) { for (int i = 0; i < _elems.Count; i++) { foreach (var cong in _congs) { if (cong.SignLink.ToString() == _elems[i].ElemName) { TimeSpan _timeBegin = timeBegin.Add(mainSign.ToTimeSpan(cong.Begin)).TimeOfDay; float delta = (float)_elems[i].Begin.TimeOfDay.Subtract(_timeBegin).TotalSeconds; if (float.IsNaN(dtime[i]) || (Math.Abs(delta) < Math.Abs(dtime[i]))) dtime[i] = delta; } } } } // Выводим результаты sb = new StringBuilder(); sb.AppendLine("File " + mainSign.ToString() + ":"); for (int i = 0; i < _elems.Count; i++) { sb.AppendFormat("[{0:T}]: ", _elems[i].Begin); if (float.IsNaN(dtime[i])) sb.Append("Failed; "); else sb.AppendFormat("Success (dev. {0}); ", TimeSpan.FromSeconds(Math.Abs(dtime[i]))); sb.AppendLine(_elems[i].ElemName); } Result(sb.ToString()); Log(sb.ToString()); } }
public bool Within(TimeInterval interval) { return (Begin.TimeOfDay <= interval.Begin.TimeOfDay) && (End.TimeOfDay >= interval.End.TimeOfDay); }