今や滅多に使わないyield return ですが、
yield returnの方が可読性良いな、と思った個所があったので久々に書いたらしくじりました。
ダサい失敗で恥ずかしいですが、2回もやったので備忘録。
概要
yield return で返り値を複数パターンの条件で分けたかった。
失敗したコード
foreach (var data in datalist)
{
var data2 = hoge(data);
if (data2 == null)
{
yield return null;
}
yield return hogehoge(data2);
}
ifの中のyield return ではそのループ処理は止まりません。
よってifの後のyield return も評価されます。
この時一回のループで2要素が返されてしまいます。
今回はhogehoge(null)
で例外が出たので気づけましたが、
例外出ないと結構厄介なバグになるかもしれませんね。
どうもreturn 句でそこで処理が止まるイメージがある様です。
でもそしたらループ毎止まるので、その点でも間違ってますね。
上手く行くコード
foreach (var data in datalist)
{
var data2 = hoge(data);
if (data2 == null)
{
yield return null;
}
else
{
//ifでどちらかのyield
yield return hogehoge(data2);
}
}
foreach (var data in datalist)
{
var data2 = hoge(data);
if (data2 == null)
{
yield return null;
//ちゃんと帰りましょう
continue;
}
yield return hogehoge(data2);
}
foreach (var data in datalist)
{
var data2 = hoge(data);
if (data2 == null)
{
//null不要ならそのままcontinue;
continue;
}
yield return hogehoge(data2);
}
foreach (var data in datalist)
{
var data2 = hoge(data);
//1行で表現したり
yield return data2 == null ? null : hogehoge(data2);
}
yield returnを複数書かなければならないと思ってしまう設計自体が悪そうなんで、
もっと構造自体を変えられないか検討した方が良いかも知れませんね。