5

次の方法があるとしましょう。中には来た

    public IEnumerable<ValidationResult> Validate(UserLoginCommand command)
    {
        User user = userRepository.Get(u => u.Email == command.UserEmail);
        if(user != null)
        {
            if(!user.Activated)
            {
                return new IEnumerable<ValidationResult>() {new ValidationResult("NotActived", Resources.UserNotActivated)};
            }

            if(user.IsPasswordIncorrent)
            {

                yield return new ValidationResult("IncorrectPassword", Resources.IncorrentPassword);

            }

        }
    }

実際の状況は実際にはもう少し複雑ですが、説明のために多くを省略しました。

重要なのは、複数のエラーを収集し続けるためにイテレータを使用したい場合です...しかし、致命的なエラーがあり、単一のエラーのみを返したいのですが、次のことはできません。

Iterator cannot contain return statement 

私は何をすべきか?

4

3 に答える 3

10

サイズ1のコレクションを返すだけの場合は、次のように実行できます。

if(!user.Activated)
{
  yield return new ValidationResult("NotActived", Resources.UserNotActivated);
  yield break;
}
于 2012-12-19T22:05:16.973 に答える
4

yield returnエラーメッセージに示されているように、ステートメントとreturnステートメントを1つのメソッドに混在させることはできません。

2つの一般的なアプローチがあります。

  1. メソッドは熱心に評価する必要があります。すべてのステートメントを使用し、すべてのステートメントをリターンreturnに変換する方法を見つける必要があります。yield
  2. このメソッドは、遅延実行を使用し、すべてのreturnステートメントをステートメントに変換する方法を見つける必要がありますyield

あなたの場合、それはおそらく#2ですが、他の状況ではどちらかが適切かもしれません。

さて、yieldaをreturn:に変える方法

単一の要素をある種のコレクションにラップし、それを返します。

return new[]{ someItemToReturn };

また

return Enumerable.Repeat<T>(someItemToReturn, 1);

さて、returnaをyield:に変える方法

foreach(var item in collectionYouWereReturning)
    yield return item;

yield break;メソッドが自然な終了に達していない場合でも、シーケンスが終了したことを示すために使用できます。yield break;使用されることはめったにないことに注意してください。それをたくさん使うとコードの臭いになります(しかし、これは適切な場合のようです)。

さて、理想的にyield foreachは、イテレータブロック内にコレクションを生成できるように、ある種のキーワードがありますが、現時点では、そのようなキーワードは言語に追加されていません。

于 2012-12-19T22:07:38.910 に答える
3

そのreturnステートメントは実際にはyieldであるべきではありませんか?

yield return ValidationResult("NotActived", Resources.UserNotActivated);

本当にコレクションを返す必要がある場合は、コレクションを返すこともできyield returnます(あなたが持っているように)。1つしかないので、それは必要ありません。

また、明示的に列挙するのをやめたい場合は、yield break;

于 2012-12-19T22:01:53.663 に答える