Разница между 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();
в чем разница между этими двумя вариантами?
3 ответов:
Selectявляется методом расширения LINQ и работает на всехIEnumerable<T>объекты, в то время какConvertAllреализуется толькоList<T>. ЭлементConvertAllметод существует с .NET 2.0, тогда как LINQ был введен с 3.5.вы должны пользу
SelectoverConvertAllкак это работает для любого вида списка, но они делают то же самое в принципе.
ConvertAllне является расширением, это метод в классе list. Вы не должны звонитьToListв результате, как это уже список:List<int> list2 = list.ConvertAll(x => 2 * x);Итак, разница в том, что
ConvertAllметод может использоваться только в списке, и он возвращает список. ЭлементSelectметод может быть использован на любой коллекции, которая реализуетIEnumerable<T>интерфейс, и он возвращаетIEnumerable<T>.кроме того, они делают обработку по-разному, поэтому у них есть свои сильные стороны в разных положения. Элемент
ConvertAllметод проходит через список и создает новый список за один раз, в то время какSelectметод использует ленивое выполнение и обрабатывает только те элементы, которые вам нужны. Если вам не нужен весь элемент, тоSelectметод более эффективен. С другой стороны, один разConvertAllвозвратил список, вам не нужно сохранять исходный список.
Я знаю, что это немного поздно, но я бы еще добавил, что это может быть полезным для других в будущем.
при использовании его в выражении запроса EntityFramework не рекомендуется использовать ConvertAll (), поскольку он вычисляет выражение, а не оставляет его в качестве выражения для будущего использования. Это серьезно снижает производительность выполнения запросов к базе данных, так как перед вычислением конечного выражения необходимо выполнить несколько вызовов.
Comments