CustomEqualityComparer.cs
49 lines
| 2.0 KiB
| text/x-csharp
|
CSharpLexer
cin
|
r289 | 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); | ||||
} | ||||
} | ||||
} | ||||