반응형
First() 또는 Find(), 그것이 문제로다.
C#으로 코딩하다 보면 list에서 해당하는 항목을 찾는 코드를 작성하곤 한다. 그리고 이때마다 First()를 써야 할지 Find()를 써야 할지 고민이 된다.
var l = new List<int> { 1, 2, 3, 4, 5 };
var x = l.First(i => i == 3);
var y = l.Find(i => i == 3);
매번 고민되는 사항이다. 일단 구현 코드를 살펴보도록 하자.
Enumerable.First()
public static TSource First<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate)
{
if (source == null)
{
throw Error.ArgumentNull("source");
}
if (predicate == null)
{
throw Error.ArgumentNull("predicate");
}
foreach (TSource local in source)
{
if (predicate(local))
{
return local;
}
}
throw Error.NoMatch();
}
List<T>.Find()
public T Find(Predicate<T> match)
{
if (match == null)
{
ThrowHelper.ThrowArgumentNullException(ExceptionArgument.match);
}
for (int i = 0; i < this._size; i++)
{
if (match(this._items[i]))
{
return this._items[i];
}
}
return default(T);
}
차이점
- First()는 해당 항목을 찾지 못하면 Exception을 반환한다. Find()는 기본값을 반환한다.
- 즉, FirstOrDefault()는 Find()와 동일하다. FirstOrDefault()는 해당 항목을 찾지 못하면 기본값을 반환한다.
- First()는 foreach로 순회한다. Find()는 for문으로 순회한다.
정리하자면
- list에 무조건 해당하는 값이 존재한다면 Fisrt()를 써도 괜찮다.
- list에 해당 값이 존재하지 않을 수도 있다면 Find(), FisrtOrDefault()를 사용하자.
참고 사이트
'프로그래밍 > C#' 카테고리의 다른 글
IEnumerable vs IQueryable 어떻게 다른지 알아보자 (0) | 2024.09.25 |
---|---|
C# Trim() 메서드에 대해서 (0) | 2024.09.10 |
Json 파일 형태에 따른 역직렬화 코드 예제 (0) | 2024.06.05 |
C# 세제곱근 계산하기 (0) | 2024.05.29 |
C# 간단하게 10진수를 2진수, 16진수로 변환하기 (0) | 2024.05.22 |
댓글