코드가 잘못되었습니다. 당신은 아마 모든 경우를 고려하지 않았습니다.
물론 코드가 올 때까지 올바른지 또는 잘못되었는지는 알 수 없습니다.
"FirstOrValue<T>
은 T와 술어 및 T 값의 시퀀스를 취해 하나의 술어와 일치하는 시퀀스의 첫 번째 아이템을 반환하거나, 또는 하나의 라인 스펙을 작성하여 시작합니다. , 없다면, 명시된 가치. "
귀하의 시도가 실제로 해당 사양을 구현합니까? 확실히! 테스트 :
int x = FirstOrValue<int>(new[] { -2, 0, 1 }, y=>y*y==y, -1);
이 경우 -1을 반환합니다. 명세에 따라 정답은 0입니다. 술어와 일치하는 첫 번째 항목은 0이므로 반환해야합니다.
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;
}
항상 먼저 스펙을 쓰기는 단지 하나의 문장의 경우에도 : 같은
사양의 올바른 구현을 보일 것이다.
이것은 프레임 워크의 일부 여야합니다! 아니면 그것을 간과 했는가? – Marcel
+1은 항상 "항상 spec을 작성하십시오". –