몇 가지 목록이 있습니다.
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 ()을 사용하지 않는 것이 좋습니다. 최종 표현식을 평가하기 전에 여러 번 호출해야하므로 데이터베이스 쿼리 실행 성능이 심각하게 저하됩니다.