Ho creato un metodo di estensione per trovare il numero di valori consecutivi in una raccolta. Poiché è generico, consento al chiamante di definire "incrementor" che è un Func <> che dovrebbe incrementare il valore per verificare l'esistenza di un valore "successivo".Come evitare la ricorsione infinita con un enumeratore personalizzato?
Tuttavia, se il chiamante passa un incrementore improprio (cioè x => x), causerà un loop ricorsivo infinito. Qualche suggerimento su un modo pulito per prevenire questo?
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;
}
La soluzione semplice è assumere che la persona che scrive il chiamante è sana. A volte devi solo incolpare la persona sopra di te. Tuttavia, questa è una domanda interessante, quindi mi piacerebbe vedere quali altre persone possono portare sul tavolo. – Polynomial
[Problema di interruzione] (http://en.wikipedia.org/wiki/Halting_problem)? –
Se IEnumerable è ampio e contiguo (dato come incrementatore), questo è suscettibile a StackOverflowExceptions. –