turns-00052.parquet:14889
1fe6abb274f2b96fe3ff66e5
turn 1/1gpt-4o-2024-08-06EnglishRussia470 words
degenerate_repetitionAbsentFinal dense release
USER
private bool CheckLevenshteinDistanceForDriverFullNameChanges(List<ObjectCompareResult> driversChanges, bool? isDriverGettingMerried)
{
var allowedDrivesChanges = driversChanges
.Where(dr => dr.ChangedFields.Any(f => _driversFieldsAllowedForChanges.Contains(f))).ToList();
var fieldsValues = new Dictionary<string, Func<Driver, string>>
{
[ChangesPaths.DriverName] = d => d.Subject.IndividualEntity.Person.Name,
[ChangesPaths.DriverMiddleName] = d => d.Subject.IndividualEntity.Person.MiddleName,
};
if (isDriverGettingMerried != true)
{
fieldsValues[ChangesPaths.DriverLastName] = d => d.Subject.IndividualEntity.Person.LastName;
}
var checkLevenshtein = CheckLevenshteinDistanceFor(
allowedDrivesChanges,
fieldsValues);
return checkLevenshtein;
}
private bool CheckLevenshteinDistanceForInsurantFullNameChanges(List<ObjectCompareResult> insurantChanges, bool? isInsurantGettingMarried)
{
var allowedInsurantChanges = insurantChanges
.Where(dr => dr.ChangedFields.Any(f => _insurantFieldsAllowedForChanges.Contains(f))).ToList();
var fieldsValues = new Dictionary<string, Func<Insurant, string>>
{
[ChangesPaths.InsurantName] = i => i.Subject.IndividualEntity.Person.Name,
[ChangesPaths.InsurantMiddleName] = i => i.Subject.IndividualEntity.Person.MiddleName
};
if (isInsurantGettingMarried != true)
{
fieldsValues[ChangesPaths.InsurantLastName] = i => i.Subject.IndividualEntity.Person.LastName;
}
var checkLevenshtein = CheckLevenshteinDistanceFor(
allowedInsurantChanges,
fieldsValues);
return checkLevenshtein;
}
private bool CheckLevenshteinDistanceForOwnerFullNameChanges(List<ObjectCompareResult> ownerChanges, bool? isOwnerGettingMerried)
{
var allowedOwnerChanges = ownerChanges
.Where(dr => dr.ChangedFields.Any(f => _ownerFieldsAllowedForChanges.Contains(f))).ToList();
var fieldsValues = new Dictionary<string, Func<Owner, string>>
{
[ChangesPaths.OwnerName] = i => i.Subject.IndividualEntity.Person.Name,
[ChangesPaths.OwnerMiddleName] = i => i.Subject.IndividualEntity.Person.MiddleName,
};
if (isOwnerGettingMerried != true)
{
fieldsValues[ChangesPaths.OwnerLastName] = i => i.Subject.IndividualEntity.Person.LastName;
}
var checkLevenshtein = CheckLevenshteinDistanceFor(
allowedOwnerChanges,
fieldsValues);
return checkLevenshtein;
}
private bool CheckLevenshteinDistanceFor<T>(
List<ObjectCompareResult> changes,
Dictionary<string, Func<T, string>> fieldValues)
where T : BaseEntity
{
return CheckLevenshteinDistanceFor(changes, fieldValues, AllowedLevenshteinDistance);
}
Как мне написать еще один метод, который будет проверять LevenshteinDistance для определенного поля, например с помощью него я бы мог отпеделить изменение отчества страхователя, а не полностью ФИОASSISTANT
Чтобы создать метод, который проверяет расстояние Левенштейна для отдельного поля (например, изменения отчества страхователя), можно передать поле, которое требуется проверить, как параметр этому методу. Таким образом, можно будет использовать его для проверки конкретного поля вместо полного имени. Вот один из способов реализации этого:
```csharp
private bool CheckLevenshteinDistanceForField<T>(
List<ObjectCompareResult> changes,
Func<T, string> fieldSelector,
string fieldPath)
where T : BaseEntity
{
var allowedChanges = changes
.Where(dr => dr.ChangedFields.Contains(fieldPath))
.ToList();
return CheckLevenshteinDistanceForField(allowedChanges, fieldSelector);
}
private bool CheckLevenshteinDistanceForField<T>(
List<ObjectCompareResult> changes,
Func<T, string> fieldSelector)
where T : BaseEntity
{
foreach (var change in changes)
{
var oldEntity = change.OldEntity as T;
var newEntity = change.NewEntity as T;
if (oldEntity != null && newEntity != null)
{
var oldValue = fieldSelector(oldEntity);
var newValue = fieldSelector(newEntity);
if (CalculateLevenshteinDistance(oldValue, newValue) <= AllowedLevenshteinDistance)
{
return true;
}
}
}
return false;
}
private int CalculateLevenshteinDistance(string source, string target)
{
// Ваш алгоритм расчета расстояния Левенштейна
// ...
}
// Пример использования:
bool isMiddleNameChangeValid = CheckLevenshteinDistanceForField<Insurant>(
insurantChanges,
i => i.Subject.IndividualEntity.Person.MiddleName,
ChangesPaths.InsurantMiddleName);
```
**Объяснение:**
1. Мы создаем новый метод `CheckLevenshteinDistanceForField` с параметрами `changes`, `fieldSelector` и `fieldPath`.
2. Мы фильтруем изменения, чтобы оставить только те, которые относятся к указанному полю `fieldPath`.
3. Для оставшихся изменений мы используем `fieldSelector` для извлечения старого и нового значения конкретного поля.
4. Мы вычисляем расстояние Левенштейна между старым и новым значениями, и если оно меньше или равно допустимому, возвращаем `true`.
5. Пример использования показывает, как проверить изменения для отчества страхователя, передавая в метод соответствующий делегат для выборки отчества и путь к этому полю.
Этот подход позволяет динамически проверять изменения для любого поля, определяемого переданными параметрами.