3 votes

comparaison structurelle en c# d'ensembles de hachage de tableaux d'int.

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);

Existe-t-il un comparateur (par défaut ?) que je peux insérer dans HashSet pour que s1.Equals(s2) soit vrai ? Je sais qu'il existe un StructuralComparisons.StructuralEqualityComparer, mais HashSet nécessite un IEqualityComparer<> générique.

UPDATE:

Ça n'a pas l'air de pouvoir marcher. Ce qui s'en rapproche le plus est l'utilisation de HashSet.SetEquals et l'ajout d'un wrapper pour StructuralComparisons.StructuralEqualityComparer comme suggéré par 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;
    }

Et puis

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

2voto

Andras Zoltan Points 24996

Non - parce que l'égalité implicite des tableaux n'est pas définie au-delà de la qualité de la référence ; et au moment de l'exécution, un tableau ne fournira pas un GetHashCode qui prendra en compte les éléments internes - parce que, correctement, il n'y a pas de cas général pour combiner les hashcodes - donc le framework n'essaie pas d'en implémenter un.

Tu devras en faire autant.

0voto

hwcverwe Points 1746

Non, par défaut il n'y a pas de comparateur mais vous pouvez créer une méthode d'extension comme celle-ci qui fait l'affaire :

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);
    }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X