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>
? (수사적 질문입니다.)
Where
및 FirstOrDefault
방법은 다음과 같은 순서의 여러 종류에 대하여 적용 할 수있는 List<T>
, T[]
, Collection<T>
구현이 있다는 등 모든 순서 IEnumerable<T>
이러한 방법을 사용할 수 있습니다. Find
에 대해서만 사용할 수 있습니다 List<T>
. 일반적으로 더 적용 가능한 방법은 더 재사용 가능 하며 더 큰 영향을 미칩니다.
다음 질문은 그들이 왜 찾기를 추가했는지에 대한 것입니다. 좋은 팁입니다. 내가 생각할 수있는 유일한 것은 FirstOrDefault가 null 이외의 다른 기본값을 반환 할 수 있다는 것입니다. 그렇지 않으면 그것은 무의미한 추가처럼 보입니다.
Find
에 List<T>
선행 다른 방법. List<T>
.NET 2.0에서 제네릭과 함께 추가 Find
되었으며 해당 클래스의 API의 일부였습니다. Where
및 FirstOrDefault
위한 확장 방법으로 첨가 IEnumerable<T>
이후 .NET 버전이다 Linq를 가진. Linq가 2.0 릴리스와 함께 존재하면 Find
추가되지 않았을 것이라고 확신 할 수 는 없지만 이전 버전에서 사용되지 않거나 중복 된 이전 .NET 버전에서 제공되는 다른 많은 기능의 경우 일 것입니다.
방금 오늘 80K 객체 목록에서 몇 가지 테스트를 수행 Find()
하여 Where
with를 사용하는 것보다 최대 1000 % 빠릅니다 FirstOrDefault()
. 나는 타이머를 테스트하기 전과 후에야 그것을 몰랐습니다. 때로는 같은 시간이었고 그렇지 않으면 더 빨랐습니다.
Find
모두와 함께 작동하는 동안에 만 구현 됩니다 .List<T>
Where().FirstOrDefault()
IEnumerable<T>
데이터 소스가 Entity Framework 인 경우 매우 중요한 차이점이 있습니다 Find
. '추가 된'상태에서 아직 유지되지 않았지만 그렇지 않은 엔티티를 찾습니다 Where
. 이것은 의도적으로 설계된 동작입니다.
Anthony와 더불어 Where()
모든 레코드를 통해 방문한 다음 결과를 반환하는 반면 Find()
, 술어가 주어진 술어와 일치하는 경우 모든 레코드를 탐색 할 필요가 없습니다.
테스트 클래스 목록 id
과 name
속성이 있다고 가정 해보십시오.
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
'Programing' 카테고리의 다른 글
Git없이 파일에 Git SHA1을 할당하는 방법은 무엇입니까? (0) | 2020.06.22 |
---|---|
엔터티 프레임 워크 .Remove () 대 .DeleteObject () (0) | 2020.06.22 |
RVM과 rbenv는 실제로 어떻게 작동합니까? (0) | 2020.06.22 |
SQL Developer에서 SQL Server 저장 프로 시저를 실행하는 방법은 무엇입니까? (0) | 2020.06.22 |
Codeigniter에서 이미지 파일, CSS, JS 등을 어디에 배치합니까? (0) | 2020.06.22 |