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의 조합보다 훨씬 효율적 입니다.SelectToList()
우선 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 |