using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;


public class TemperatureComparerClass : IEqualityComparer<Temperature>
{   // Scénario différent de IEquatable: Tempréature égale si T1.1=T2.1 et T1.2=T2.2
    public bool Equals(Temperature temp1,Temperature temp2)
    {   
       if ((temp1.Temperature_Capteur1 == temp2.Temperature_Capteur1) &&
            (temp1.Temperature_Capteur2 == temp2.Temperature_Capteur2))
            return true;
        else return false;
    }
    public int GetHashCode(Temperature temp)
    {   // utilisé par Dictionnary ou SortedList pour définir une clé INTERNEde rangement
        // pas d'obligation d'être unique (mais suffisamment différente)
        // HashCode <> de Key!!! Key doit être unique car clé de recherche de vos données
        return ((int)(temp.Temperature_Capteur1 * temp.Temperature_Capteur2));
    }

}



public class Temperature : IEquatable<Temperature>
{
    // Implémentation de IEquatable
    //paramètre <T> de type Temperature
    public bool Equals(Temperature other)
    {   // appel de méthode par défaut Equals des types par valeurs double.Equals
        return Temperature_Moyenne.Equals(other.Temperature_Moyenne);
    }
    // propriétés AUTO
    public double Temperature_Moyenne {get;set;}
    public double Temperature_Capteur1 { get; set; }
    public double Temperature_Capteur2 { get; set; }
    
    // CTOR
    public Temperature(double degreesKelvin1, double degreesKelvin2)
    {
        Temperature_Capteur1 = degreesKelvin1;
        this.Temperature_Capteur2 = degreesKelvin2;
        Temperature_Moyenne = (degreesKelvin1 + degreesKelvin2) / 2;
    }
}

public class Example
{
    public static void Main()
    {
        Stack<Temperature> temps =
            new Stack<Temperature>();

        temps.Push(new Temperature(2017,1000));
        temps.Push(new Temperature(0, 100));
        temps.Push(new Temperature(2017, 1000));
        temps.Push(new Temperature(50, 75));
        temps.Push(new Temperature(100, 0));

        foreach (Temperature t in temps)
        {
            Console.Write("Compare {0} {1} avec ref {2} {3}",
                     t.Temperature_Capteur1, t.Temperature_Capteur2,
                     temps.Peek().Temperature_Capteur1, temps.Peek().Temperature_Capteur2);
            if (t.Equals(temps.Peek())) // Peek renvoie l'objet au dessus de la pile
                Console.WriteLine("température moyenne égale");
            else
                Console.WriteLine("température moyenne différente");
        }

        // Mise en place d'un scénario différent pour les requetes LINQ
        IEnumerable<Temperature> tempSansDoublons=Enumerable.Distinct(temps, new TemperatureComparerClass());
        var requete2 = tempSansDoublons.Where(temp => ( (temp.Temperature_Capteur1 > 50) &&
                                                        (temp.Temperature_Capteur1 > 25)
                                                      ));
        foreach (Temperature t in requete2)
            Console.WriteLine("température capt1:{0} capt2:{1}",t.Temperature_Capteur1,t.Temperature_Capteur2);

        Console.ReadKey();
        
    }
}



