C #에서 Select와 ConvertAll의 차이점
몇 가지 목록이 있습니다.
List<int> list = new List<int> { 1, 2, 3, 4, 5 };
내 목록의 요소에 약간의 변형을 적용하고 싶습니다. 두 가지 방법으로이 작업을 수행 할 수 있습니다.
List<int> list1 = list.Select(x => 2 * x).ToList();
List<int> list2 = list.ConvertAll(x => 2 * x).ToList();
이 두 가지 방법의 차이점은 무엇입니까?
Select
는 LINQ 확장 방법이며 모든 IEnumerable<T>
객체에서 작동 하지만 ConvertAll
로만 구현됩니다 List<T>
. 이 ConvertAll
방법은 .NET 2.0부터 존재하지만 LINQ는 3.5에서 도입되었습니다.
당신은 선호합니다 Select
이상 ConvertAll
이 목록의 모든 종류의 작품으로,하지만 그들은 기본적으로 동일한 작업을 수행.
ConvertAll
확장이 아니며 목록 클래스의 메소드입니다. ToList
이미 목록이므로 결과 를 호출 할 필요가 없습니다 .
List<int> list2 = list.ConvertAll(x => 2 * x);
따라서 차이점은이 ConvertAll
메서드는 목록에서만 사용할 수 있으며 목록을 반환한다는 것입니다. 이 Select
메서드는 IEnumerable<T>
인터페이스 를 구현하는 모든 컬렉션에서 사용할 수 있으며를 반환합니다 IEnumerable<T>
.
또한 처리를 다르게 수행하므로 상황에 따라 장점이 있습니다. ConvertAll
그동안 방법의 목록을 통해 실행하고, 한 번에 새 목록을 생성 Select
하는 방법은 게으른 실행을 사용하고 당신이 그들을 필요로하는 항목 만 처리합니다. 모든 항목이 필요하지 않은 경우 Select
방법이 더 효율적입니다. 반면에 한 번 ConvertAll
목록을 반환하면 원래 목록을 유지할 필요가 없습니다.
첫 번째 대답은 받아 들여서는 안됩니다. 전 2007 C # Microsoft MVP입니다.
허용되는 응답과 달리 및 ConvertAll
의 조합보다 훨씬 효율적 입니다.Select
ToList()
우선 ConvertAll
엄밀히 빠르며 최소한의 메모리를 사용합니다. Array.ConvertAll과 Select 및 ToArray와 동일합니다. 이것은 더 긴 길이의 배열이나 루프 내의 많은 호출에서 훨씬 더 분명합니다.
1) ConvertAll
최종 목록의 크기를 알고 기본 배열을 재할 당하지 않습니다. ToList
()는 배열의 크기를 여러 번 계속 조정합니다.
2) ToList
인터페이스 IEnumerable<>
호출 속도가 느려지고 ConvertAll
추가 호출이나 범위 검사없이 기본 배열을 반복합니다.
3) 선택하면 추가 IEnumerable<T>
개체 가 생성됩니다 .
나는 이것이 조금 늦었다는 것을 알고 있지만 앞으로 다른 사람들에게 유용 할 수 있기 때문에 여전히 추가했습니다.
EntityFramework 쿼리 표현식에서 사용하는 경우 나중에 사용할 수 있도록 표현식으로 남겨 두지 않고 표현식을 평가할 때 ConvertAll ()을 사용하지 않는 것이 좋습니다. 최종 표현식을 평가하기 전에 여러 번 호출해야하므로 데이터베이스 쿼리 실행 성능이 심각하게 저하됩니다.
참고 URL : https://stackoverflow.com/questions/1571819/difference-between-select-and-convertall-in-c-sharp
'Programming' 카테고리의 다른 글
함수 제목의 화살표 연산자 (->) (0) | 2020.08.05 |
---|---|
openssl verify를 사용하여 인증서 체인 확인 (0) | 2020.08.05 |
Firefox에서 개발 된 Javascript가 IE에서 실패하는 일반적인 이유는 무엇입니까? (0) | 2020.08.05 |
ASP.Net 오류 : " 'foo'형식이"temp1.dll "과"temp2.dll에 모두 있습니다 " (0) | 2020.08.05 |
파이썬 그룹 (0) | 2020.08.05 |