본문 바로가기
프로그래밍/C#

C# list 검색 시 First() vs Find() 차이점

by bantomak 2024. 6. 24.

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# Difference between First() and Find()

So I know that Find() is only a List<T> method, whereas First() is an extension for any IEnumerable<T>. I also know that First() will return the first element if no parameter is passed,

stackoverflow.com

댓글