HashSet перекрытия не работает, как ожидалось - PullRequest
1 голос
/ 09 ноября 2019

Имейте объектную модель, как показано ниже, с HashSets:

Когда я пытаюсь найти соответствующий набор с оператором ниже, не работает. Может кто-нибудь подсказать, что мне здесь не хватает?

Решит ли HashSet.CreateSetComparer проблему, если да, то не могли бы вы порекомендовать, как ее использовать?

Заявление о перекрытии HashSet:

var requirementSets = new HashSet<RequirementSet>();
// requirementSets has some data.

RequirementSet matchingSet = requirementSets.FirstOrDefault(e => e.RequirementOption s.Overlaps(lineItemRequirementSet.RequirementOptions));

Модель объекта:

public class RequirementSet : IEquatable<RequirementSet>
{
    public ISet<RequirementOption> RequirementOptions { get; } = new HashSet<RequirementOption>();

public bool Equals(RequirementSet other)
    {
        if (ReferenceEquals(null, other))
        {
            return false;
        }

        if (ReferenceEquals(this, other))
        {
            return true;
        }

        return Equals(RequirementOptions, other.RequirementOptions);
    }

    public override bool Equals(object obj)
    {
        if (ReferenceEquals(null, obj))
        {
            return false;
        }

        if (ReferenceEquals(this, obj))
        {
            return true;
        }

        if (obj.GetType() != this.GetType())
        {
            return false;
        }

        return Equals((RequirementSet) obj);
    }

    public override int GetHashCode()
    {
        return RequirementOptions != null ? RequirementOptions.GetHashCode() : 0;
    }
}

public class RequirementOption : IEquatable<RequirementOption>
{
    public ISet<Requirement> Requirements { get; } = new HashSet<Requirement>();

public bool Equals(RequirementOption other)
    {
        if (ReferenceEquals(null, other))
        {
            return false;
        }

        if (ReferenceEquals(this, other))
        {
            return true;
        }

        return Equals(Requirements, other.Requirements);
    }

    public override bool Equals(object obj)
    {
        if (ReferenceEquals(null, obj))
        {
            return false;
        }

        if (ReferenceEquals(this, obj))
        {
            return true;
        }

        if (obj.GetType() != this.GetType())
        {
            return false;
        }

        return Equals((RequirementOption) obj);
    }

    public override int GetHashCode()
    {
        return Requirements != null ? Requirements.GetHashCode() : 0;
    }
}

public class Requirement : IEquatable<Requirement>
{
    public string Model {get; set;}

public bool Equals(Requirement other)
    {
        if (ReferenceEquals(null, other))
        {
            return false;
        }

        if (ReferenceEquals(this, other))
        {
            return true;
        } 

        return ModelName == other.ModelName;
    }

    public override bool Equals(object obj)
    {
        if (ReferenceEquals(null, obj))
        {
            return false;
        }

        if (ReferenceEquals(this, obj))
        {
            return true;
        }

        if (obj.GetType() != this.GetType())
        {
            return false;
        } 

        return Equals((Requirement) obj);
    }

    public override int GetHashCode()
    {
        unchecked
        {
            var hashCode = ModelName != null ? ModelName.GetHashCode();

            return hashCode;
        }
    }
}
...