view Implab/CustomEqualityComparer.cs @ 239:eedf4d834e67 v2

fix
author cin
date Wed, 13 Dec 2017 19:54:45 +0300
parents c0bf853aa04f
children
line wrap: on
line source

using Implab;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Implab {
    /// <summary>
    /// Обертка для создания <c>IEqualityComparer</c> с использованием делегатов или лямда-выражений.
    /// </summary>
    /// <typeparam name="T">Тип сравниваемых значений</typeparam>
    public class CustomEqualityComparer<T> : IEqualityComparer<T> {
        Func<T, T, bool> m_equals;
        Func<T, int> m_hash;

        /// <summary>
        /// Создает новый объект с указанными функциями сравнения на раветво и получения хеш-кода.
        /// </summary>
        /// <param name="equality">Функция проверки на равенство</param>
        /// <param name="hash">Функция получения хешкода</param>
        public CustomEqualityComparer(Func<T, T, bool> equality, Func<T, int> hash) {
            Safe.ArgumentNotNull(equality, "equality");
            Safe.ArgumentNotNull(hash, "hash");
            m_hash = hash;
            m_equals = equality;
        }

        /// <summary>
        /// Сравнивает два знаечния на ревенство.
        /// </summary>
        /// <param name="x"></param>
        /// <param name="y"></param>
        /// <returns>Результат сравнения на равенство</returns>
        public bool Equals(T x, T y) {
            return m_equals(x,y);
        }

        /// <summary>
        /// Получает хеш-код для указанного значения.
        /// </summary>
        /// <param name="obj"></param>
        /// <remarks>Равные знаечния *должны* иметь одинаковый хеш-код.</remarks>
        /// <returns>Хеш-код</returns>
        public int GetHashCode(T obj) {
            return m_hash(obj);
        }
    }
}