diff options
Diffstat (limited to 'src/mscorlib/src/System/Collections/StructuralComparisons.cs')
-rw-r--r-- | src/mscorlib/src/System/Collections/StructuralComparisons.cs | 89 |
1 files changed, 89 insertions, 0 deletions
diff --git a/src/mscorlib/src/System/Collections/StructuralComparisons.cs b/src/mscorlib/src/System/Collections/StructuralComparisons.cs new file mode 100644 index 0000000000..685af59c4b --- /dev/null +++ b/src/mscorlib/src/System/Collections/StructuralComparisons.cs @@ -0,0 +1,89 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. + +// + +using System; + +namespace System.Collections { + public static class StructuralComparisons { + + private static volatile IComparer s_StructuralComparer; + private static volatile IEqualityComparer s_StructuralEqualityComparer; + + public static IComparer StructuralComparer { + get { + IComparer comparer = s_StructuralComparer; + if (comparer == null) { + comparer = new StructuralComparer(); + s_StructuralComparer = comparer; + } + return comparer; + } + } + + public static IEqualityComparer StructuralEqualityComparer { + get { + IEqualityComparer comparer = s_StructuralEqualityComparer; + if (comparer == null) { + comparer = new StructuralEqualityComparer(); + s_StructuralEqualityComparer = comparer; + } + return comparer; + } + } + } + + [Serializable] + internal class StructuralEqualityComparer : IEqualityComparer { + public new bool Equals(Object x, Object y) { + if (x != null) { + + IStructuralEquatable seObj = x as IStructuralEquatable; + + if (seObj != null){ + return seObj.Equals(y, this); + } + + if (y != null) { + return x.Equals(y); + } else { + return false; + } + } + if (y != null) return false; + return true; + } + + public int GetHashCode(Object obj) { + if (obj == null) return 0; + + IStructuralEquatable seObj = obj as IStructuralEquatable; + + if (seObj != null) { + return seObj.GetHashCode(this); + } + + return obj.GetHashCode(); + } + } + + [Serializable] + internal class StructuralComparer : IComparer { + public int Compare(Object x, Object y) { + + if (x == null) return y == null ? 0 : -1; + if (y == null) return 1; + + IStructuralComparable scX = x as IStructuralComparable; + + if (scX != null) { + return scX.CompareTo(y, this); + } + + return Comparer.Default.Compare(x, y); + } + } + +} |