パフォーマンスの点でより良いことに同意します(編集:述語に一致するアイテムが複数あると予想される場合、これは行うべきではありません):
foreach (TSource current in source)
{
if (predicate(current))
{
result = current;
num += 1L;
if (num > 1L)
throw Error.MoreThanOneMatch();
}
}
if (num == 0L)
throw Error.NoMatch();
return local;
彼らは、分析結果をより明確にし、列挙ソースから分離することを決定したようです。しかし、なぜ単純なスイッチが使用されなかったのだろうか:
switch((int)num)
{
case 0: throw Error.NoMatch();
case 1: return local;
default:
throw Error.MoreThanOneMatch();
}
パフォーマンスの問題に関しては、単一の結果を本当に期待してSingle
いるときに呼び出す必要があると想定されていると思います。ゼロ以上の結果は例外的なパスであり、(例外として) 頻繁に発生するべきではありません。したがって、ソースに述語に一致する多くの項目が含まれていると、プログラムの論理エラーになります。