2
respostas

LINQ - DÚVIDA NA SINTAXE DA ALTERNATIVA CORRETA

Neste exercício:

var query = from a in atletas where a.CodigoPais == "JAM" select a;

O correto não seria : where a.CodigoPais equals "JAM" ?

2 respostas

Olá Antônio.

Os dois casos irão funcionar, então fica a seu critério. Eu mesmo geralmente tendo a preferir where a.CodigoPais == "JAM".

Para comparar objetos de classes complexas, como a classe Atleta do exemplo, o uso de Equals é obrigatório. Lembra que ao comparar dois objetos, na verdade, está comparando o conteúdo que, no caso, vai ser o endereço de memória onde os dados estão salvos?

Atleta a1 = new Atleta { Posicao = 1, CodigoPais = "JAM", Nome = "BOLT Usain"};
Atleta a2 = new Atleta { Posicao = 1, CodigoPais = "JAM", Nome = "BOLT Usain"};

//Retorna False, pois a1 e a2 apontam para endereços de memória diferentes.
Console.WriteLine(a1 == a2);

//Já utilizando Equals vai retornar True, pois as propriedades estão com os mesmos valores.
Console.WriteLine(a1.Equals(a2));

Lembrando que seria necessário rescrever o método Equals da classe Atleta.

public override bool Equals(object obj)
{
    var outroAtleta = (Atleta)obj;
    return this.Posicao.Equals(outroAtleta.Posicao)
            && this.CodigoPais.Equals(outroAtleta.CodigoPais)
            && this.Nome.Equals(outroAtleta.Nome);
}

Veja que para as propriedades posso escolher utilizar Equals ou == que vai funcionar, mas para objetos complexos não vai funcionar.

public override bool Equals(object obj)
{
    var outroAtleta = (Atleta)obj;
    return this.Posicao == outroAtleta.Posicao
            && this.CodigoPais == outroAtleta.CodigoPais
            && this.Nome == outroAtleta.Nome;
}