Votre code est probablement incorrect; vous n'avez probablement pas considéré tous les cas.
Bien sûr, nous ne pouvons pas savoir si un code est correct ou incorrect jusqu'à ce que nous ayons une spécification. Commencez par écrire une spécification d'une ligne:
"FirstOrValue<T>
prend une séquence de T, un prédicat et une valeur de T, et renvoie le premier élément de la séquence qui correspond au prédicat s'il y en a un, ou , s'il n'y en a pas, la valeur déclarée. "
Est-ce que votre tentative implémente réellement cette spécification? Certainement pas! Testez-le:
int x = FirstOrValue<int>(new[] { -2, 0, 1 }, y=>y*y==y, -1);
cela renvoie -1. La réponse correcte selon la spécification est 0. Le premier élément qui correspond au prédicat est zéro, il doit donc être retourné.
Une bonne mise en œuvre de la spécification ressemblerait à ceci:
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;
}
toujours écrire une spécification d'abord, même si elle est seulement une seule phrase.
Cela devrait faire partie du Cadre! Ou ai-je négligé cela? – Marcel
+1 pour "Toujours écrire une spécification en premier". –