2012-01-11 6 views
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"); 
     } 

ValidatorHelper

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

'FirstName'이 유효하면 코드가 'null'을 반환 할 예정입니까? –

+0

아니, 그냥 성 반환처럼 아무것도. –

+0

글쎄, 나는 '수익률 반환'의 거장은 아니지만'FirstOrDefault'의'OrDefault' 부분이'FirstName'이'null' 또는 공백이 아닌 경우'null' 값을 돌려주지 않을까요? –

답변

2

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

저는 아닙니다. 내가 할 수있는 것처럼 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를 사용하여 자신이 목록을 작성하고 (모든 필드 매번 확인하는 I 돈 있지만 저장하려면 이 문제가 성능 문제라고 생각하면) AddIfRequiredValidationResultIfRequiredValidate으로 만들 수 있습니다.

ValidationResult validationResult; 

// ... 

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

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