コレクション内の連続する値の数を見つけるための拡張メソッドを作成しました。それは一般的なので、呼び出し元に "次の"値の存在をチェックするために値をインクリメントするFunc <>である "インクリメンタ"を定義することができます。カスタム列挙子で無限再帰を避けるにはどうすればよいですか?
しかし、呼び出し元が不適切なインクリメンタ(x => x)を渡すと、無限の再帰的ループが発生します。これを防ぐためのきれいな方法に関する提案はありますか?
public static int CountConsecutive<T>(this IEnumerable<T> values, T startValue, Func<T, T> incrementor)
{
if (values == null)
{
throw new ArgumentNullException("values");
}
if (incrementor == null)
{
throw new ArgumentNullException("incrementor");
}
var nextValue = incrementor(startValue);
return values.Contains(nextValue)
? values.CountConsecutive(nextValue, incrementor) + 1
: 1;
}
単純な解決策は、発信者を書く人がまともであると仮定することです。時にはあなたの人をあなたのせいにしなければならないこともあります。しかし、これは興味深い質問ですので、私は他の人がテーブルにもたらすことができるものを見たいと思います。 – Polynomial
[停止問題](http://ja.wikipedia.org/wiki/Halting_problem)? –
IEnumerableが大きく連続している(インクリメンタが指定されている)場合、これはStackOverflowExceptionsの影響を受けます。 –