Nesta postagem vamos ver as diferenças entre esses dois tipos de objetos em C#, quando é recomendado utilizar cada um deles e quais cuidados devemos ter em utilizá-los.
Diferenças entre o IEnumerable e List
- IEnumerable descreve um comportamento e List implementa esse comportamento (aquela definição bonita que encontramos na internet hahahaha).
- IEnumerable é uma interface que define um método para iterar sobre uma coleção de um tipo específico (Exemplo:
IEnumerable<Pessoa>
), permitindo a leitura sequencial dos elementos. É "read-only", o que significa que não podemos alterar diretamente a coleção, apenas iterar sobre seus elementos. O tipo List, por outro lado, implementa a interface IEnumerable e também a interface ICollection, o que lhe confere métodos adicionais para adicionar, remover e modificar elementos na coleção. - IEnumerable possui um método para retornar o próximo item na coleção, permitindo a execução sem a necessidade de ter toda a coleção em memória ou saber quantos itens há nela. Isso é útil para trabalhar com grandes volumes de dados, pois permite a execução adiada das operações (explicarei melhor esse ponto). Quando utilizado em um loop como foreach, ele vai retornando o próximo item até que a coleção termine. Já o tipo List mantém todos os seus elementos em uma estrutura dinamicamente alocada na memória, facilitando o acesso e a modificação dos elementos.
- Ao usar IEnumerable, adiamos a execução das operações até que sejam necessárias. Isso significa que consultas ou operações de filtragem usando IEnumerable só são executadas quando os resultados são acessados, o que pode melhorar o desempenho e reduzir o consumo de memória em comparação com operações imediatas fornecidas por List.
Para entender melhor este último ponto, vamos fazer o seguinte teste:
private void TesteIEnumerable()
{
var nomes = new List<string> { "Luis", "João", "Ricardo", "Alexandre" };
IEnumerable<string> nomesContenhamLetraO = nomes.Where(x => x.Contains("o"));
nomes[0] = "Marcos";
foreach (var nome in nomesContenhamLetraO)
{
Console.WriteLine(nome);
}
}
Executando o código acima, os nomes exibidos no console serão:
Marcos
João
Ricardo
Observe que mesmo mudando o nome "Luis" para "Marcos" após criar o objeto IEnumerable, ele foi mostrado no console. Isso ocorre porque o IEnumerable só foi executado dentro do loop foreach, e a alteração foi feita antes.
Agora vamos fazer o mesmo teste com o tipo List:
private void TesteList()
{
var nomes = new List<string> { "Luis", "João", "Ricardo", "Alexandre" };
List<string> nomesContenhamLetraO = nomes.Where(x => x.Contains("o")).ToList();
nomes[0] = "Marcos";
foreach (var nome in nomesContenhamLetraO)
{
Console.WriteLine(nome);
}
}
Executando este código, os nomes exibidos no console serão:
João
Ricardo
No segundo exemplo, o objeto List já estava criado e armazenado em memória com o nome "Luis".
Quando usar cada um
De maneira básica, devemos usar IEnumerable quando desejamos apenas ler a coleção ou quando lidamos com um grande volume de dados e queremos evitar problemas de desempenho causados pela cópia total na memória.
Por outro lado, devemos utilizar List quando precisamos alterar a coleção ou precisamos dos resultados imediatamente. List oferece métodos convenientes para adicionar, remover e modificar elementos na coleção, o que é ideal para operações que envolvem manipulação de dados.
Referência:
C# IEnumerable vs List and Array
Top comments (11)
God, simplesmente demonstrou maestria na explicação com mostrando a definição formal primeiro, depois desmistificando e traduzindo em uma linguagem simples e clara e com exemplos de forma gradual, maestral meu colega.
Vlw demais pela força Mateus! =)
Super claro, parabéns pela explicação!
Obrigado pelo feedback William
Mandou muito bem! Parábens!
Ótima explicação, obrigado
Da hora, obrigado pela explicação.
Vlw pelo feedback =)
Excelente explicação!
Obrigado amigo.
Show cara. Ajudou muito!