DEV Community

Marcos Belorio
Marcos Belorio

Posted on Edited on

Entendendo as diferenças entre IEnumerable e List em C#

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);
    }
}
Enter fullscreen mode Exit fullscreen mode

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);
    }
}
Enter fullscreen mode Exit fullscreen mode

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)

Collapse
 
mateusredfield profile image
mateusredfield •

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.

Collapse
 
marcosbelorio profile image
Marcos Belorio •

Vlw demais pela força Mateus! =)

Collapse
 
m_calixto profile image
Marcelo Calixto •

Ótima explicação, obrigado

Collapse
 
william59m profile image
William59m •

Super claro, parabéns pela explicação!

Collapse
 
marcosbelorio profile image
Marcos Belorio •

Obrigado pelo feedback William

Collapse
 
nathanndos profile image
Nathan Silva •

Mandou muito bem! Parábens!

Collapse
 
rodrigomarcell profile image
Rodrigo Marcell •

Da hora, obrigado pela explicação.

Collapse
 
marcosbelorio profile image
Marcos Belorio •

Vlw pelo feedback =)

Collapse
 
jadinhu profile image
Jadson Almeida •

Excelente explicação!

Collapse
 
marcosbelorio profile image
Marcos Belorio •

Obrigado amigo.

Collapse
 
athosluan profile image
Athos Luan •

Show cara. Ajudou muito!