File: System\Xml\XPath\XPathNavigatorKeyComparer.cs
Web Access
Project: src\src\libraries\System.Private.Xml\src\System.Private.Xml.csproj (System.Private.Xml)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using System.Collections;
using MS.Internal.Xml.Cache;
 
namespace System.Xml.XPath
{
    internal sealed class XPathNavigatorKeyComparer : IEqualityComparer
    {
        bool IEqualityComparer.Equals(object? obj1, object? obj2)
        {
            XPathNavigator? nav1 = obj1 as XPathNavigator;
            XPathNavigator? nav2 = obj2 as XPathNavigator;
            if ((nav1 != null) && (nav2 != null))
            {
                if (nav1.IsSamePosition(nav2))
                    return true;
            }
            return false;
        }
 
        int IEqualityComparer.GetHashCode(object obj)
        {
            ArgumentNullException.ThrowIfNull(obj);
 
            int hashCode;
            XPathNavigator? nav;
            XPathDocumentNavigator? xpdocNav;
 
            if (null != (xpdocNav = obj as XPathDocumentNavigator))
            {
                hashCode = xpdocNav.GetPositionHashCode();
            }
            else if (null != (nav = obj as XPathNavigator))
            {
                object? underlyingObject = nav.UnderlyingObject;
                if (underlyingObject != null)
                {
                    hashCode = underlyingObject.GetHashCode();
                }
                else
                {
                    hashCode = (int)nav.NodeType;
                    hashCode ^= nav.LocalName.GetHashCode();
                    hashCode ^= nav.Prefix.GetHashCode();
                    hashCode ^= nav.NamespaceURI.GetHashCode();
                }
            }
            else
            {
                hashCode = obj.GetHashCode();
            }
            return hashCode;
        }
    }
}