c # структурное сравнение хеш-наборов массивов int - PullRequest
2 голосов
/ 28 марта 2012
var comparer = ...
var s1 = new HashSet<int[]>(new[] { new[] { 1, 2 }, new[] { 3, 4 } }, comparer);
var s2 = new HashSet<int[]>(new[] { new[] { 1, 2 }, new[] { 3, 4 } }, comparer);

Есть ли (по умолчанию?) Компаратор, который я могу подключить к HashSet, чтобы s1.Equals (s2) был верным?Я знаю, что есть StructuralComparisons.StructuralEqualityComparer, но HashSet требует универсального IEqualityComparer <>.

ОБНОВЛЕНИЕ:

Не похоже, что это когда-либо может работать.Самое близкое, что я получаю, - это использование HashSet.SetEquals и подключение оболочки для StructuralComparisons.StructuralEqualityComparer, как предложено phoog

    internal class GenericStructuralComparer<T> : IEqualityComparer<T>
    {
        static GenericStructuralComparer<T> _instance;

        public static IEqualityComparer<T> Instance
        {
            get { return _instance ?? (_instance = new GenericStructuralComparer<T>()); }
        }

        public bool Equals(T x, T y)
        {
            return StructuralComparisons.StructuralEqualityComparer.Equals(x, y);
        }

        public int GetHashCode(T obj)
        {
            return StructuralComparisons.StructuralEqualityComparer.GetHashCode(obj);
        }
    }

    public static IEqualityComparer<T> StructuralComparer<T>()
    {
        return GenericStructuralComparer<T>.Instance;
    }

И затем

var comparer = StructuralComparer<int[]>();
var s1 = new HashSet<int[]>(new[] { new[] { 1, 2 }, new[] { 3, 4 } }, comparer);
var s2 = new HashSet<int[]>(new[] { new[] { 1, 2 }, new[] { 3, 4 } }, comparer);
s1.SetEquals(s2); // True

Ответы [ 2 ]

2 голосов
/ 28 марта 2012

Нет - потому что неявное равенство массивов не определено сверх эталонного качества;и во время выполнения массив не предоставит GetHashCode, который будет учитывать внутренние элементы - потому что, правильно, нет общего случая для объединения хэш-кодов - поэтому фреймворк не пытается реализовать один.

Тебе придется бросить свой собственный.

0 голосов
/ 28 марта 2012

Нет, по умолчанию нет компаратора, но вы можете создать такой метод расширения, который сделает свое дело:

public static class HashSetExt
{
    public static bool HashSetEqualsTo<T>(this HashSet<T> set, HashSet<T> other)
    {
        return //Your own compare method
    }
}

class Program
{
    static void Main(string[] args)
    {
        var s1 = new HashSet<int[]>(new[] { new[] { 1, 2 }, new[] { 3, 4 } });
        var s2 = new HashSet<int[]>(new[] { new[] { 1, 2 }, new[] { 3, 4 } });
        var isEquals = s1.HashSetEqualsTo<int[]>(s2);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...