Il tuo codice è probabilmente errato; probabilmente non hai considerato tutti i casi.
Naturalmente, non possiamo sapere se esiste il codice è corretto o non corretto finché non avremo uno spec. Quindi inizia scrivendo una specifica su una riga:
"FirstOrValue<T>
prende una sequenza di T, un predicato e un valore di T, e restituisce il primo elemento nella sequenza che corrisponde al predicato se ce n'è uno, oppure , se non c'è, il valore dichiarato. "
Il vostro tentativo effettivamente attuare tale spec? Certamente no! Provalo:
int x = FirstOrValue<int>(new[] { -2, 0, 1 }, y=>y*y==y, -1);
restituisce -1. La risposta corretta in base alle specifiche è 0. Il primo elemento che corrisponde al predicato è zero, quindi deve essere restituito.
Una corretta applicazione delle specifiche sarà simile:
public static T FirstOrValue<T>(this IEnumerable<T> sequence, Func<T, bool> predicate, T value)
{
if (sequence == null) throw new ArgumentNullException("sequence");
if (predicate == null) throw new ArgumentNullException("predicate");
foreach(T item in sequence)
if (predicate(item)) return item;
return value;
}
Sempre scrivere una specifica prima, anche se è solo una sola frase.
fonte
2009-11-10 16:18:13
Questo dovrebbe essere parte del Framework! O l'ho trascurato? – Marcel
+1 per "Scrivi sempre una specifica prima". –