1

次の設定でを取り除く方法はありますか.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");
        }

バリデータヘルパー

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

2 に答える 2

2

foreachnull別のオプションになります(例のように検証エラーがない場合、誤って返されることはありません):

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");
}
于 2012-01-11T01:56:44.103 に答える
1

私は私ができるほど精通していません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にすることができます。ValidationResultIfRequiredValidate

ValidationResult validationResult;

// ...

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

validationResult = ValidationResultIfRequired(entity.Profile.LastName, "Last Name");
// etc
于 2012-01-11T02:02:26.413 に答える