Альтернативный способ записать доходность - PullRequest
1 голос
/ 11 января 2012

Есть ли способ избавиться от .FirstOrDefault() с помощью следующей настройки. Мне нравится использовать оператор yield, но я хочу сжать метод IsRequired до такой степени, что мне не нужно использовать .FirstOrDefault().

PlayerValidator

protected override IEnumerable<ValidationResult> Validate(PlayerModel entity, IValidationProvider validationProvider)
        {
            yield return ValidationResultHelper.IsRequired(entity.Profile.FirstName, "First Name").FirstOrDefault();

            if (string.IsNullOrWhiteSpace(entity.Profile.LastName))
                yield return new Required("Last Name");
        }

ValidatorHelper

public IEnumerable<ValidationResult> IsRequired(string text, string name)
{
    if (string.IsNullOrWhiteSpace(text))
        yield return new Required(name);
}

Ответы [ 2 ]

2 голосов
/ 11 января 2012

foreach будет другим вариантом (и он не вернет ошибочно null в случае отсутствия ошибки проверки, как в вашем примере):

protected override IEnumerable<ValidationResult> Validate(PlayerModel entity, IValidationProvider validationProvider)
{
    foreach (var result in ValidationResultHelper.IsRequired(entity.Profile.FirstName, "First Name"))
        yield return result;
    if (string.IsNullOrWhiteSpace(entity.Profile.LastName))
        yield return new Required("Last Name");
}
1 голос
/ 11 января 2012

Я не настолько знаком с yield return, как мог бы быть, но в этом случае я думаю, что способ, которым вы использовали yield return в IsRequired, использует неправильный инструмент для работы. Я бы структурировал это немного по-другому:

ValidatorHelper

// Note this function is almost unnecessary and might be better
// implemented in AddIfRequired if validation is this trivial.
public static bool IsRequired(string text)
{
    return string.IsNullOrWhiteSpace(text);
}

PlayerValidator

private static void AddIfRequired(string text, string name, List<ValidationResult> validationResults)
{
    if (ValidatorHelper.IsRequired(text))
        requiredList.Add(new Required(name));
}

protected override IEnumerable<ValidationResult> Validate(PlayerModel entity, IValidationProvider validationProvider)
{
    List<ValidationResult> validationResults = new List<ValidationResult>();

    AddIfRequired(entity.Profile.FirstName, "First Name", validationResults);
    AddIfRequired(entity.Profile.LastName, "Last Name", validationResults);
    // ...

    return validationResults;
}

Если вы действительно хотите использовать yield return и сохранить себя, создавая список и проверяя все поля каждый раз (хотя я не думаю, что это будет проблемой производительности), вы можете сделать AddIfRequired в ValidationResultIfRequired Validate в:

ValidationResult validationResult;

// ...

validationResult = ValidationResultIfRequired(entity.Profile.FirstName, "First Name");
if (validationResult != null)
    yield return validationResult;

validationResult = ValidationResultIfRequired(entity.Profile.LastName, "Last Name");
// etc
...