Существует несколько мест, где комитет по стандарту C++ действительно не оптимизировал взаимодействие между средствами в стандартной библиотеке.
std::string
и его использование в библиотеке один из них.
Еще один пример std::swap
. Много контейнеров имеют функцию членства подкачки, но никакую перегрузку станд.:: подкачка предоставляется. То же идет для std::sort
.
я надеюсь, что все эти мелочи будут зафиксированы в предстоящем стандарте.
Select
является методом расширения LINQ и работает со всеми объектами IEnumerable
, тогда как ConvertAll
реализуется только List
. Метод ConvertAll
существует начиная с .NET 2.0, тогда как LINQ был представлен в версии 3.5.
Вы должны отдать предпочтение Выберите
вместо ConvertAll
, поскольку он работает для любого типа списков , но в основном они делают то же самое.
ConvertAll
- это не расширение, это метод класса списка. Вам не нужно вызывать ToList
для результата, так как это уже список:
List<int> list2 = list.ConvertAll(x => 2 * x);
Итак, разница в том, что метод ConvertAll
можно использовать только для списка, и он возвращает список. Метод Select
можно использовать в любой коллекции, реализующей интерфейс IEnumerable
, и он возвращает IEnumerable
.
Также, они выполняют обработку по-разному, поэтому в разных ситуациях у них есть свои сильные стороны. Метод ConvertAll
просматривает список и создает новый список за один раз, в то время как метод Select
использует отложенное выполнение и обрабатывает элементы только по мере необходимости. Если вам не нужны все элементы, более эффективен метод Выбрать
. С другой стороны, как только ConvertAll
вернет список, вам не нужно сохранять исходный список.