Eu tenho alguma lista:
List<int> list = new List<int> { 1, 2, 3, 4, 5 };
Quero aplicar alguma transformação aos elementos da minha lista. Posso fazer isso de duas maneiras:
List<int> list1 = list.Select(x => 2 * x).ToList();
List<int> list2 = list.ConvertAll(x => 2 * x).ToList();
Qual é a diferença entre essas duas formas?
Respostas:
Select
é um método de extensão LINQ e funciona em todos osIEnumerable<T>
objetos, emboraConvertAll
seja implementado apenas porList<T>
. OConvertAll
método existe desde .NET 2.0, enquanto LINQ foi introduzido com 3.5.Você deve favorecer
Select
sobreConvertAll
como ele funciona para qualquer tipo de lista, mas eles fazem o mesmo, basicamente.fonte
Select
eConvertAll
. O primeiro seleciona cada item em uma sequência e você está livre para fazer o que quiser com ele. Este último tem uma intenção clara: converter este item em outra coisa.ConvertAll
não é uma extensão, é um método na classe de lista. Você não precisa chamarToList
o resultado, pois já é uma lista:Portanto, a diferença é que o
ConvertAll
método só pode ser usado em uma lista e retorna uma lista. OSelect
método pode ser usado em qualquer coleção que implemente aIEnumerable<T>
interface e retorna umIEnumerable<T>
.Além disso, eles fazem o processamento de forma diferente, portanto, eles têm seus pontos fortes em diferentes situações. O
ConvertAll
método percorre a lista e cria uma nova lista de uma vez, enquanto oSelect
método usa a execução lenta e processa os itens apenas quando você precisa deles. Se você não precisa de todos os itens, oSelect
método é mais eficiente. Por outro lado, depois deConvertAll
devolver a lista, não é necessário guardar a lista original.fonte
Select
.A primeira resposta não deve ser a aceita. Eu sou um ex-2007 C # Microsoft MVP.
Em contraste com a resposta aceita,
ConvertAll
é muito mais eficiente do que a combinação deSelect
eToList()
.Em primeiro lugar,
ConvertAll
é estritamente mais rápido e usa o mínimo de memória para isso. O mesmo que Array.ConvertAll vs Select e ToArray. Isso seria muito mais evidente com uma matriz de comprimento maior ou muitas chamadas em um loop.1)
ConvertAll
conhece o tamanho da lista final e evita realocar o array base.ToList
() continuará a redimensionar o array várias vezes.2)
ToList
faráIEnumerable<>
chamadas de interface mais lentas , enquantoConvertAll
fará um loop pela matriz subjacente sem chamadas extras ou verificações de intervalo.3) Selecionar criará um
IEnumerable<T>
objeto extra .fonte
Eu sei que é um pouco tarde, mas ainda assim adicionei porque isso poderia ser de alguma utilidade para outros no futuro.
Ao usá-lo na expressão de consulta EntityFramework, não é recomendado usar ConvertAll (), pois ele avalia a expressão em vez de deixá-la como expressão para uso futuro. Isso degrada seriamente o desempenho da execução da consulta ao banco de dados, pois seria necessário fazer várias chamadas antes de avaliar a expressão final.
fonte
ConvertAll
é um métodoList<T>
. Quando você tem a lista, já avaliou sua expressão. Mas você está certo - se você não quiser avaliar tudo,Select
é preferível.