Desenvolvimento

28 mai, 2018

C# – Diferentes maneiras de criar uma lista de objetos

Publicidade

Neste artigo, vou mostrar diferentes maneiras de criar uma lista de objetos na linguagem C#.

Mãos à obra!

Recursos usados:

Criando o projeto no VS 2017 Community

Abra o VS 2017 Community e crie um novo projeto do tipo Console App com o nome CSharp_ListaObjetos:

Com o projeto criado, vamos criar uma pasta chamada Services, onde iremos criar a classe Livro e os serviços que vão fornecer a lista de objetos. No menu “Project”, clique em “New Folder” e informe Services.

A seguir, clique com o botão direito sobre a pasta Services, clique em “Add Class” e informe o nome Livro.

Inclua então o código abaixo nesta classe:

public class Livro
    {
        public int LivroId { get; set;} 
        public string Titulo { get; set; } = string.Empty;
        public string Autor { get; set; } = string.Empty;
        public string ISBN { get; set; } = string.Empty;
        public Livro()
        { }

        public Livro(int id, string titulo,string autor, string isbn)
        {
           LivroId = id;
           Titulo = titulo;
           Autor = autor;
           ISBN = isbn;
        }
    }

A classe Livro possui quatro propriedades e dois construtores.

Agora vamos iniciar a criação das listas de objetos da classe Livro iniciando com a sintaxe mais básica.

1 – Antes da versão 3.0 da linguagem, geralmente criávamos uma lista de objetos usando o código abaixo:

using System.Collections.Generic;
namespace CSharp_ListaObjetos.Services
{
    public class LivrosService1
    {
       public List<Livro> GetLivros()
       {
            var listaLivros = new List<Livro>();
            // Inicializa o objeto e o inclui na coleção
            var livro1 = new Livro(1,"ASP, ADO e Banco de dados na web","Macoratti","8585943963");
            listaLivros.Add(livro1);
            var livro2 = new Livro(2,"ASP - Aprenda Rápido", "Macoratti", "8585845214");
            listaLivros.Add(livro2);
            return listaLivros;
        }
    }
}

Uma variação do código acima seria usar o método AddRange que adiciona os elementos da coleção ao final da lista:

using System.Collections.Generic;
namespace CSharp_ListaObjetos.Services
{
    public class LivrosService1
    {
       public static List<Livro> GetLivros()
       {
            var listaLivros = new List<Livro>();
            listaLivros.AddRange(new[] {
                new Livro(1,"ASP, ADO e Banco de dados na web","Macoratti","8585943963"),
                new Livro(2,"ASP - Aprenda Rápido", "Macoratti", "8585845214")
            });
            return listaLivros;
        }
    }
}

2 – Com o lançamento da versão 3.0 da linguagem, tivemos muitas melhorias, incluindo o recurso Collection Initializers/inicializadores de coleção, que usamos a seguir:

using System.Collections.Generic;
namespace CSharp_ListaObjetos.Services
{
    class LivrosService2
    {
        public static List<Livro> GetLivros()
        {
            var listaLivros = new List<Livro>()
            {
                new Livro { LivroId=1,Titulo="ASP, ADO e Banco de dados na web",Autor="Macoratti", ISBN="8585943963"},
                new Livro { LivroId=2,Titulo="ASP - Aprenda Rápido",Autor="Macoratti", ISBN="8585845214"}
            };
            return listaLivros;
        }
    }
}

O namespace System.Linq possui a classe Enumerable, que contém métodos estáticos que podemos usar para criar uma lista de objetos.

O método Enumerable.Repeat permite gerar uma sequência que contém um valor repetido.

A sintaxe é:

public static IEnumerable<TResult> Repeat<TResult>(TResult element, int count)

Onde:

TResult é o elemento a ser repetido e count é o número de vezes a repetir o elemento. Ele é mais indicado para inicializar uma lista de objetos com múltiplas cópias do mesmo elemento.

Para o nosso exemplo, podemos fazer assim:

using System.Collections.Generic;
namespace CSharp_ListaObjetos.Services
{
    class LivrosService2
    {
        public static List<Livro> GetLivros()
        {
             var listaLivros = Enumerable.Repeat(new Livro(), 2).ToList();
             return listaLivros;
        }
    }
}

Espiando o objeto listaLivros, veremos os dois objetos Livro criados:

Um outro método da mesma classe é Enumerable.Range, que pode gerar uma coleção em um intervalo especificado.

A sintaxe é:

public static IEnumerable<int> Range(int start,int count)

Onde:

start é o valor do primeiro inteiro da sequência e count representa os números inteiros a serem gerados.

Usando uma variação deste método para o nosso exemplo, temos:

using System.Collections.Generic;
namespace CSharp_ListaObjetos.Services
{
    class LivrosService2
    {
        public static List<Livro> GetLivros()
        {
             var listaLivros = Enumerable.Range(1, 2).Select(i => new Livro()).ToList();
             return listaLivros;
        }
    }
}

O resultado é o mesmo obtido no método Enumerable.Repeat.

Para concluir e acessar a lista de objetos criada, podemos iterar sobre a coleção usando um foreach:

using CSharp_ListaObjetos.Services;
using System;
using System.Collections.Generic;
namespace CSharp_ListaObjetos
{
    class Program
    {
        static void Main(string[] args)
        {
            List<Livro> lista = LivrosService1.GetLivros();
            lista.ForEach(lv => Console.WriteLine(lv.Titulo+"\t"+ lv.Autor));
            Console.ReadKey();
        }
    }
}

E estamos conversados!