1

Jun

un comparer generico

ciao a tutti

a volte ci capita di aver bisogno di comparer generici per implementare un .Distinct() in una nostra istruzione LINQ o per altri scenari.
ho creato una classe comoda per implementare questa logica:

[code language="csharp"]

            var antonio = new { Name = "antonio" };
            var mario = new { Name = "mario" };

            //per semplicità avendo usato tipi anonimi uso dynamic, altrimenti userei delle classi esplicite
            var comparer = new GenericComparer((x, y) => x.Name == y.Name);

            var equals = antonio.Equals(mario); // di default i tipi anonimi vengono verificati per tutte le loro proprietà
            var equals2 = comparer.Equals(antonio,mario);

            var distinct = new[] { antonio, mario }.Distinct();
            var distinct2 = new[] { antonio, mario }.Distinct(comparer);

    public class GenericComparer : IEqualityComparer
    {
        private Func Comparer;
        private Func HashGenerator;

        public GenericComparer(Func comparer)
        {
            this.Comparer = comparer;
        }

        public GenericComparer(Func comparer, Func hashGenerator)
            : this(comparer)
        {
            HashGenerator = hashGenerator;
        }

        public bool Equals(T x, T y)
        {
            return Comparer(x, y);
        }

        public int GetHashCode(T obj)
        {
            return HashGenerator != null
                ? HashGenerator(obj)
                : obj.GetHashCode();
        }
    }

[/code]

by Antonio Esposito on 6/1/2011