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
 
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
 
m_calixto profile image
Marcelo Calixto

Ótima explicação, obrigado

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!