CdpEqualityComparer.cs source code in C# .NET

Source code for the .NET framework in C#

                        

Code:

/ Dotnetfx_Vista_SP2 / Dotnetfx_Vista_SP2 / 8.0.50727.4016 / DEVDIV / depot / DevDiv / releases / Orcas / QFE / ndp / fx / src / DataEntity / System / Data / Common / Utils / CdpEqualityComparer.cs / 1 / CdpEqualityComparer.cs

                            //---------------------------------------------------------------------- 
// 
//      Copyright (c) Microsoft Corporation.  All rights reserved.
// 
// 
// @owner [....]
// @backupOwner [....] 
//--------------------------------------------------------------------- 

 
using System;
using System.Collections;
using System.Text;
using System.Globalization; 
using System.Data.SqlTypes;
using System.Diagnostics; 
 
namespace System.Data.Common.Utils
{ 
    /// 
    /// Equality comparer implementation that uses case-sensitive ordinal comparison for strings.
    /// 
    internal sealed class CdpEqualityComparer : IEqualityComparer 
    {
        ///  
        /// Private constructor to ensure comparer is only accessed through the  
        /// property.
        ///  
        private CdpEqualityComparer()
        {
        }
 
        private static readonly IEqualityComparer s_defaultEqualityComparer = new CdpEqualityComparer();
 
        ///  
        /// Gets instance of CdpEqualityComparer.
        ///  
        static internal IEqualityComparer DefaultEqualityComparer { get { return s_defaultEqualityComparer; } }

        /// 
        /// This mirrors the .NET implementation of System.Collections.Comparer but 
        /// uses an ordinal comparer for strings rather than a linguistic compare.
        ///  
        /// First object to compare 
        /// Second object to compare
        /// True if the arguments are equivalent; false otherwise 
        bool IEqualityComparer.Equals(object x, object y)
        {
            // if the objects are equal by reference, return immediately
            if (x == y) { return true; } 

            // if either one or the other objects is null, return false 
            // (they cannot both be null, because otherwise the reference equality check 
            // would have succeeded)
            if (null == x || null == y) { return false; } 

            // if we're dealing with strings, special handling is required
            string xAsString = x as string;
            if (null != xAsString) 
            {
                string yAsString = y as string; 
 
                if (null != yAsString)
                { 
                    return StringComparer.Ordinal.Equals(xAsString, yAsString);
                }
                else
                { 
                    // string implements IComparable, so we can avoid a second cast
                    return 0 == xAsString.CompareTo(y); 
                } 
            }
 
            // use first argument as IComparable
            IComparable xAsComparable = x as IComparable;
            if (null != xAsComparable)
            { 
                return 0 == xAsComparable.CompareTo(y);
            } 
            else 
            {
                // default to Equals implementation 
                return x.Equals(y);
            }
        }
 
        /// 
        /// Retursn hash code for given object. 
        ///  
        /// Object for which to produce hash code (throws if null)
        /// Hash code for argument 
        int IEqualityComparer.GetHashCode(object obj)
        {
            Debug.Assert(null != obj);
            return obj.GetHashCode(); 
        }
    } 
} 


// File provided for Reference Use Only by Microsoft Corporation (c) 2007.
//---------------------------------------------------------------------- 
// 
//      Copyright (c) Microsoft Corporation.  All rights reserved.
// 
// 
// @owner [....]
// @backupOwner [....] 
//--------------------------------------------------------------------- 

 
using System;
using System.Collections;
using System.Text;
using System.Globalization; 
using System.Data.SqlTypes;
using System.Diagnostics; 
 
namespace System.Data.Common.Utils
{ 
    /// 
    /// Equality comparer implementation that uses case-sensitive ordinal comparison for strings.
    /// 
    internal sealed class CdpEqualityComparer : IEqualityComparer 
    {
        ///  
        /// Private constructor to ensure comparer is only accessed through the  
        /// property.
        ///  
        private CdpEqualityComparer()
        {
        }
 
        private static readonly IEqualityComparer s_defaultEqualityComparer = new CdpEqualityComparer();
 
        ///  
        /// Gets instance of CdpEqualityComparer.
        ///  
        static internal IEqualityComparer DefaultEqualityComparer { get { return s_defaultEqualityComparer; } }

        /// 
        /// This mirrors the .NET implementation of System.Collections.Comparer but 
        /// uses an ordinal comparer for strings rather than a linguistic compare.
        ///  
        /// First object to compare 
        /// Second object to compare
        /// True if the arguments are equivalent; false otherwise 
        bool IEqualityComparer.Equals(object x, object y)
        {
            // if the objects are equal by reference, return immediately
            if (x == y) { return true; } 

            // if either one or the other objects is null, return false 
            // (they cannot both be null, because otherwise the reference equality check 
            // would have succeeded)
            if (null == x || null == y) { return false; } 

            // if we're dealing with strings, special handling is required
            string xAsString = x as string;
            if (null != xAsString) 
            {
                string yAsString = y as string; 
 
                if (null != yAsString)
                { 
                    return StringComparer.Ordinal.Equals(xAsString, yAsString);
                }
                else
                { 
                    // string implements IComparable, so we can avoid a second cast
                    return 0 == xAsString.CompareTo(y); 
                } 
            }
 
            // use first argument as IComparable
            IComparable xAsComparable = x as IComparable;
            if (null != xAsComparable)
            { 
                return 0 == xAsComparable.CompareTo(y);
            } 
            else 
            {
                // default to Equals implementation 
                return x.Equals(y);
            }
        }
 
        /// 
        /// Retursn hash code for given object. 
        ///  
        /// Object for which to produce hash code (throws if null)
        /// Hash code for argument 
        int IEqualityComparer.GetHashCode(object obj)
        {
            Debug.Assert(null != obj);
            return obj.GetHashCode(); 
        }
    } 
} 


// File provided for Reference Use Only by Microsoft Corporation (c) 2007.

                        

Link Menu

Network programming in C#, Network Programming in VB.NET, Network Programming in .NET
This book is available now!
Buy at Amazon US or
Buy at Amazon UK