Разница между Select и ConvertAll в C#



у меня есть список:



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();


в чем разница между этими двумя вариантами?

578   3  

3 ответов:

Select является методом расширения LINQ и работает на всех IEnumerable<T> объекты, в то время как ConvertAll реализуется только List<T>. Элемент ConvertAll метод существует с .NET 2.0, тогда как LINQ был введен с 3.5.

вы должны пользу Select over ConvertAll как это работает для любого вида списка, но они делают то же самое в принципе.

ConvertAll не является расширением, это метод в классе list. Вы не должны звонить ToList в результате, как это уже список:

List<int> list2 = list.ConvertAll(x => 2 * x);

Итак, разница в том, что ConvertAll метод может использоваться только в списке, и он возвращает список. Элемент Select метод может быть использован на любой коллекции, которая реализует IEnumerable<T> интерфейс, и он возвращает IEnumerable<T>.

кроме того, они делают обработку по-разному, поэтому у них есть свои сильные стороны в разных положения. Элемент ConvertAll метод проходит через список и создает новый список за один раз, в то время как Select метод использует ленивое выполнение и обрабатывает только те элементы, которые вам нужны. Если вам не нужен весь элемент, то Select метод более эффективен. С другой стороны, один раз ConvertAll возвратил список, вам не нужно сохранять исходный список.

Я знаю, что это немного поздно, но я бы еще добавил, что это может быть полезным для других в будущем.

при использовании его в выражении запроса EntityFramework не рекомендуется использовать ConvertAll (), поскольку он вычисляет выражение, а не оставляет его в качестве выражения для будущего использования. Это серьезно снижает производительность выполнения запросов к базе данных, так как перед вычислением конечного выражения необходимо выполнить несколько вызовов.

Comments

    Ничего не найдено.