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 é "read-only", ou seja, eu não consigo alterar a coleção, somente ler. O tipo List implementa uma variedade de métodos capazes de alterar a coleção.
- IEnumerable possui um método para retornar o próximo item na coleção, com isso ele não precisa que toda coleção esteja em memória e também não sabe quantos itens estão nela. Quando utilizado em um loop como o foreach, ele apenas vai retornando o próximo item até que termine a coleção. Já o tipo List possui toda a coleção em memória, sendo assim o List sabe quantos itens possui a coleção.
- Quando você usa IEnumerable, você dá ao compilador a chance de adiar a execução, isso porque o IEnumerable não é executado enquanto não passar em um loop ou enquanto um tipo de valor não é extraído da variável em que foi salvo.
Para entender melhor este último item, 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 temos no console os seguintes nomes:
Marcos
João
Ricardo
Note que mesmo mudando o nome de Luis para Marcos após ter criado o objeto IEnumerable, ele mostrou no console o nome Marcos. Isso porque o IEnumerable somente foi executado dentro do loop do foreach, e mudamos o nome 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 o código acima temos no console os seguintes nomes:
João
Ricardo
Neste segundo exemplo o objeto List já havia sido criado e armazenado em memória com o nome Luis.
Quando usar cada um
De uma forma bem básica podemos dizer que devemos usar IEnumerable quando queremos apenas ler a coleção ou quando estamos trabalhando com um volume muito grande de dados e não queremos copiar tudo na memória e causar problemas de desempenho.
Por outro lado quando precisamos alterar a coleção, ou precisamos dos resultados imediatamente, devemos utilizar o tipo List.
Referência:
C# IEnumerable vs List and Array
Top comments (10)
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
Da hora, obrigado pela explicação.
Vlw pelo feedback =)
Excelente explicação!
Obrigado amigo.
Mandou muito bem! Parábens!
Ótima explicação, obrigado