HashSet overlaps does not work as expected

338 Views Asked by At

Have the object model as shown below with HashSets:

When I try to find the matching set with the below statement does not work. Could someone please suggest what am I missing here?

Would HashSet.CreateSetComparer solve the problem, if so could you please suggest how to use it?

HashSet Overlaps Statement:

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

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

Object Model:

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

There are 0 best solutions below