Programming

C #에서 Select와 ConvertAll의 차이점

procodes 2020. 8. 5. 21:41
반응형

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

반응형