Проверять вложенные списки на уникальные значения, не повторяя один и тот же список несколько раз - PullRequest
0 голосов
/ 22 января 2020

Скажем, у меня есть коллекция вложенных списков, и в каждом из этих списков я хочу убедиться, что все значения уникальны на основе свойства id. Я могу легко l oop просмотреть каждый список и подсписки, чтобы проверить это, но мне интересно, как сделать эквивалент с FluentValidation.

Если у меня есть CustomData объект, который выглядит как

{
  "continents": [
    {
      "id": "1",
      "countries": [
        {
          "id": "UK",
          "cities": [
            {
              "id": "London",
              "streets": [
                {
                  "id": "1"
                }
              ]
            }
          ]
        }
      ]
    }
  ]
}

Я могу сделать пользовательский fluentvalidator для этого объекта; public class CustomDataValidator : AbstractValidator<CustomData> и добавьте правило для проверки уникальности в Continents:

RuleFor(customData => customData.Continents)
    .Must(continents) => HaveUniqueValues(continents))
    .WithMessage(x => "Continents contain duplicates")
    .When(x => !customData.Continents.IsNullOrEmpty());


...
bool HaveUniqueValues(IEnumerable<Continent> collection){
    return collection.Distinct(x => x.Id).Count() == collection.Count(); //simplified for this example
}

Но как мне убедиться, что правила для всех вложенных списков (стран, городов, улиц), таких как страны, не будут oop снова через родительские списки?

Другое правило для таких стран, как ниже, будет повторять континенты снова:

RuleFor(customData => customData.Continents)
    .Must(continents => continents.All(c => !c.Countries.IsNullOrEmpty() && HaveUniqueValues(c.Countries)))
    .WithMessage(x => "Continents contain duplicates")
    .When(x => !customData.Continents.IsNullOrEmpty());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...