DEV Community

loading...

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

Marcos Belorio
・2 min read

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 capaz 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

Discussion (2)

Collapse
jadinhu profile image
Jadson Almeida

Excelente explicação!

Collapse
marcosbelorio profile image
Marcos Belorio Author

Obrigado amigo.