programing

C#에서 SelectAll과 ConvertAll의 차이

i4 2023. 5. 21. 10:57
반응형

C#에서 SelectAll과 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();

이 두 가지 방법의 차이점은 무엇입니까?

SelectLINQ 확장 방법이며 모두에서 작동합니다.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# 마이크로소프트 MVP입니다.

받아들여진 반응과는 대조적으로,ConvertAll의 조합보다 훨씬 효율적입니다.Select그리고.ToList().

일단은.ConvertAll더 빠르고 최소한의 메모리를 사용합니다.배열과 동일합니다.모두 변환 vs. 선택 및 ToArray.이는 더 큰 길이 배열 또는 루프 내의 많은 호출에서 훨씬 더 명확합니다.

1)ConvertAll최종 목록의 크기를 알고 기본 배열의 재할당을 방지합니다. ToList()는 배열 크기를 여러 번 계속 조정합니다.

2)ToList인터페이스 속도가 느려집니다.IEnumerable<>호출, 동안ConvertAll추가 호출이나 범위 검사 없이 기본 배열을 순환합니다.

선택하면 추가 항목이 생성됩니다.IEnumerable<T>물건.

이것이 조금 늦었다는 것을 알지만, 이것이 미래에 다른 사람들에게 유용할 수 있기 때문에 저는 여전히 추가했습니다.

EntityFramework 쿼리 식을 사용할 때는 나중에 사용할 식을 그대로 두는 대신 식을 평가하므로 ConvertAll()을 사용하지 않는 것이 좋습니다.이는 최종 표현식을 평가하기 전에 호출 횟수를 늘려야 하므로 데이터베이스 쿼리 실행 성능을 심각하게 저하시킵니다.

언급URL : https://stackoverflow.com/questions/1571819/difference-between-select-and-convertall-in-c-sharp

반응형