public static class Procedures
{
    public static int LevenshteinDistance(string str1, string str2)
    {
        if (str1 == null)
        {
            throw new ArgumentNullException("str1");
        }

        if (str2 == null)
        {
            throw new ArgumentNullException("str2");
        }

        int[,] array = new int[str1.Length + 1, str2.Length + 1];
        for (int i = 0; i <= str1.Length; i++)
        {
            array[i, 0] = i;
        }

        for (int j = 0; j <= str2.Length; j++)
        {
            array[0, j] = j;
        }

        for (int k = 1; k <= str1.Length; k++)
        {
            for (int l = 1; l <= str2.Length; l++)
            {
                int num = ((str1[k - 1] != str2[l - 1]) ? 1 : 0);
                array[k, l] = Math.Min(Math.Min(array[k - 1, l] + 1, array[k, l - 1] + 1), array[k - 1, l - 1] + num);
            }
        }

        return array[str1.Length, str2.Length];
    }
}

        /// <summary>
        /// Проверяет для список изменений, что изменения для указанных свойств не превышают допустимого расстояния Левенштейна.
        /// </summary>
        /// <typeparam name="T">Тип сущности, в которой были изменения.</typeparam>
        /// <param name="changes">список изменений.</param>
        /// <param name="fieldValues">Список полей для проверки. Ключ - имя изменённого поля в ObjectCompareResult, Значение - функция для получения этого свойства.</param>
        /// <param name="allowedLevensteinDistamce">Допустимое расстояние по Левенштейну.</param>
        /// <returns>Истина - если изменения были в допустимых пределах, иначе - Ложь.</returns>
        protected bool CheckLevenshteinDistanceFor<T>(
            List<ObjectCompareResult> changes,
            Dictionary<string, Func<T, string>> fieldValues,
            int allowedLevensteinDistamce)
            where T : BaseEntity
        {
            return !changes.Any(change =>
            {
                var exp = (T)change.ExpectedObject;
                var act = (T)change.ActualObject;

                return fieldValues.Any(
                    fieldValue =>
                        change.ChangedFields.Contains(fieldValue.Key)
                        && InsuranceApp.Infrastructure.Procedures.LevenshteinDistance(
                            fieldValue.Value(exp) ?? string.Empty,
                            fieldValue.Value(act) ?? string.Empty) > allowedLevensteinDistamce);
            });
        }

        private bool CheckLevenshteinDistanceFor<T>(
            List<ObjectCompareResult> changes,
            Dictionary<string, Func<T, string>> fieldValues)
            where T : BaseEntity
        {
            return CheckLevenshteinDistanceFor(changes, fieldValues, AllowedLevenshteinDistance);
        }

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

            if (!CheckLevenshteinDistanceForInsurantFullNameChanges(insurantChanges, isInsurantGettingMarried))
            {
                var errorMessage = isInsurantGettingMarried == true
                    ? "Не допускается изменение более " + AllowedLevenshteinDistance + " символов в поле имя и отчество страхователя."
                    : "Не допускается изменение более " + AllowedLevenshteinDistance + " символов в поле ФИО страхователя.";
                resultErrors.Add(errorMessage);
            }


При удалении первых двух символов в двух и более полях ФИО в ответе метода Modify возвращается ошибка: 
"Недопустимые изменения: Не допускается изменение более 2 символов в поле имя и отчество страхователя."

Этой ошибки быть не должно