Programing

Find () 및 Where (). FirstOrDefault ()

lottogame 2020. 6. 22. 07:51
반응형

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(). 나는 타이머를 테스트하기 전과 후에야 그것을 몰랐습니다. 때로는 같은 시간이었고 그렇지 않으면 더 빨랐습니다.


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


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


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();

참고 URL : https://stackoverflow.com/questions/9335015/find-vs-where-firstordefault

반응형