[C#] Find () 및 Where (). FirstOrDefault ()

나는 종종 사람들 Where.FirstOrDefault()이 검색을하고 첫 번째 요소를 얻는 것을 사용하는 것을 본다 . 왜 사용하지 Find()않습니까? 다른쪽에 이점이 있습니까? 나는 차이를 말할 수 없었다.

namespace LinqFindVsWhere
{
    class Program
    {
        static void Main(string[] args)
        {
            List<string> list = new List<string>();
            list.AddRange(new string[]
            {
                "item1",
                "item2",
                "item3",
                "item4"
            });

            string item2 = list.Find(x => x == "item2");
            Console.WriteLine(item2 == null ? "not found" : "found");
            string item3 = list.Where(x => x == "item3").FirstOrDefault();
            Console.WriteLine(item3 == null ? "not found" : "found");
            Console.ReadKey();
        }
    }
}



답변

Find방법 은 어디에 있습니까 IEnumerable<T>? (수사적 질문입니다.)

WhereFirstOrDefault방법은 다음과 같은 순서의 여러 종류에 대하여 적용 할 수있는 List<T>, T[], Collection<T>구현이 있다는 등 모든 순서 IEnumerable<T>이러한 방법을 사용할 수 있습니다. Find에 대해서만 사용할 수 있습니다 List<T>. 일반적으로 더 적용 가능한 방법은 더 재사용 가능 하며 더 큰 영향을 미칩니다.

다음 질문은 그들이 왜 찾기를 추가했는지에 대한 것입니다. 좋은 팁입니다. 내가 생각할 수있는 유일한 것은 FirstOrDefault가 null 이외의 다른 기본값을 반환 할 수 있다는 것입니다. 그렇지 않으면 그것은 무의미한 추가처럼 보입니다.

FindList<T>선행 다른 방법. List<T>.NET 2.0에서 제네릭과 함께 추가 Find되었으며 해당 클래스의 API의 일부였습니다. WhereFirstOrDefault위한 확장 방법으로 첨가 IEnumerable<T>이후 .NET 버전이다 Linq를 가진. Linq가 2.0 릴리스와 함께 존재하면 Find추가되지 않았을 것이라고 확신 할 수 는 없지만 이전 버전에서 사용되지 않거나 중복 된 이전 .NET 버전에서 제공되는 많은 다른 기능의 경우 일 것입니다.


답변

방금 오늘 80K 객체 목록에서 몇 가지 테스트를 수행 Find()하여 Wherewith을 사용하는 것보다 최대 1000 % 빠릅니다 FirstOrDefault(). 나는 타이머를 테스트하기 전과 후에야 그것을 몰랐습니다. 때로는 같은 시간이었고 그렇지 않으면 더 빨랐습니다.


답변

데이터 소스가 Entity Framework 인 경우 매우 중요한 차이점이 있습니다 Find. ‘추가됨’상태에서 아직 유지되지 않았지만 그렇지 않은 엔티티를 찾습니다 Where. 이것은 의도적으로 설계된 동작입니다.


답변

Find모두와 함께 작동하는 동안에 만 구현 됩니다 .List<T>Where().FirstOrDefault()IEnumerable<T>


답변

Anthony와 더불어
Where()모든 레코드를 통해 방문한 다음 결과를 반환하는 반면 Find(), 술어가 주어진 술어와 일치하는 경우 모든 레코드를 탐색 할 필요가 없습니다.

테스트 클래스 목록 idname속성이 있다고 가정 해보십시오.

 List<Test> tests = new List<Test>();
 tests.Add(new Test() { Id = 1, Name = "name1" });
 tests.Add(new Test() { Id = 2, Name = "name2" });
 tests.Add(new Test() { Id = 3, Name = "name3" });
 tests.Add(new Test() { Id = 4, Name = "name2" });
 var r = tests.Find(p => p.Name == "name2");
 Console.WriteLine(r.Id);

의 결과를 제공하고 방문을 22 회만 제공합니다. 결과를 제공하는 데 필요한 정보를 찾으십시오. 그러나 사용하는 경우 모든 레코드를 방문하여 결과를 얻습니다.Where().FirstOrDefault()

따라서 컬렉션의 레코드에서 얻은 첫 번째 결과 만 Find()더 적합하다는 것을 알고 있으면Where().FirtorDefault();


답변

와우, 오늘 Youtube에서 MicrosofToolbox의 EF 튜토리얼을 볼 수 있습니다. 그는 쿼리에서 Find () 및 FirstOrDefault (condition) 사용에 대해 말했으며 Find ()는 해당 객체에서 수행 한 데이터를 추가하거나 편집하거나 삭제하지만 아직 데이터베이스에 저장하지 않은 데이터를 검색하지만 FirstOrDefault는 이미 저장된 것을 찾으십시오


답변

Find()는 IEnumerable에 해당합니다 FirstOrDefault(). 전체 배열을 거치고 첫 번째 항목을 찾기 위해 해당 목록을 반복 .FirstOrDefault()하기 때문에 .Where ()와 체인을 연결해서는 안됩니다 .Where(). FirstOrDefault()메소드에 검색 술어를 넣어서 시간을 크게 절약 할 수 있습니다.

또한 .Find()특정 시나리오 에서 Find ()의 성능과 FirstOrDefault ()의 성능에 대한 성능에 대한 자세한 내용을 보려면이 스레드에 연결된 질문을 읽으십시오.