DEV Community

Marcos Belorio
Marcos Belorio

Posted on • Updated 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 é "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);
    }
}
Enter fullscreen mode Exit fullscreen mode

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

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)

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
 
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
 
nathanndos profile image
Nathan Silva

Mandou muito bem! Parábens!

Collapse
 
m_calixto profile image
Marcelo Calixto

Ótima explicação, obrigado