55
|
1 using Implab;
|
|
2 using System;
|
|
3 using System.Collections.Generic;
|
|
4 using System.Linq;
|
|
5 using System.Text;
|
|
6 using System.Threading.Tasks;
|
|
7
|
|
8 namespace Implab {
|
|
9 /// <summary>
|
|
10 /// Обертка для создания <c>IEqualityComparer</c> с использованием делегатов или лямда-выражений.
|
|
11 /// </summary>
|
|
12 /// <typeparam name="T">Тип сравниваемых значений</typeparam>
|
|
13 public class CustomEqualityComparer<T> : IEqualityComparer<T> {
|
|
14 Func<T, T, bool> m_equals;
|
|
15 Func<T, int> m_hash;
|
|
16
|
|
17 /// <summary>
|
|
18 /// Создает новый объект с указанными функциями сравнения на раветво и получения хеш-кода.
|
|
19 /// </summary>
|
|
20 /// <param name="equality">Функция проверки на равенство</param>
|
|
21 /// <param name="hash">Функция получения хешкода</param>
|
|
22 public CustomEqualityComparer(Func<T, T, bool> equality, Func<T, int> hash) {
|
|
23 Safe.ArgumentNotNull(equality, "equality");
|
|
24 Safe.ArgumentNotNull(hash, "hash");
|
|
25 m_hash = hash;
|
|
26 m_equals = equality;
|
|
27 }
|
|
28
|
|
29 /// <summary>
|
|
30 /// Сравнивает два знаечния на ревенство.
|
|
31 /// </summary>
|
|
32 /// <param name="x"></param>
|
|
33 /// <param name="y"></param>
|
|
34 /// <returns>Результат сравнения на равенство</returns>
|
|
35 public bool Equals(T x, T y) {
|
|
36 return m_equals(x,y);
|
|
37 }
|
|
38
|
|
39 /// <summary>
|
|
40 /// Получает хеш-код для указанного значения.
|
|
41 /// </summary>
|
|
42 /// <param name="obj"></param>
|
|
43 /// <remarks>Равные знаечния *должны* иметь одинаковый хеш-код.</remarks>
|
|
44 /// <returns>Хеш-код</returns>
|
|
45 public int GetHashCode(T obj) {
|
|
46 return m_hash(obj);
|
|
47 }
|
|
48 }
|
|
49 }
|