// 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. /*============================================================ ** ** Purpose: Default IComparer implementation. ** ===========================================================*/ using System.Globalization; using System.Runtime.Serialization; namespace System.Collections { [Serializable] [System.Runtime.CompilerServices.TypeForwardedFrom("mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089")] public sealed class Comparer : IComparer, ISerializable { private CompareInfo _compareInfo; public static readonly Comparer Default = new Comparer(CultureInfo.CurrentCulture); public static readonly Comparer DefaultInvariant = new Comparer(CultureInfo.InvariantCulture); public Comparer(CultureInfo culture) { if (culture == null) throw new ArgumentNullException(nameof(culture)); _compareInfo = culture.CompareInfo; } private Comparer(SerializationInfo info, StreamingContext context) { if (info == null) throw new ArgumentNullException(nameof(info)); _compareInfo = (CompareInfo)info.GetValue("CompareInfo", typeof(CompareInfo)); } public void GetObjectData(SerializationInfo info, StreamingContext context) { if (info == null) throw new ArgumentNullException(nameof(info)); info.AddValue("CompareInfo", _compareInfo); } // Compares two Objects by calling CompareTo. // If a == b, 0 is returned. // If a implements IComparable, a.CompareTo(b) is returned. // If a doesn't implement IComparable and b does, -(b.CompareTo(a)) is returned. // Otherwise an exception is thrown. // public int Compare(object a, object b) { if (a == b) return 0; if (a == null) return -1; if (b == null) return 1; string sa = a as string; if (sa != null && b is string sb) return _compareInfo.Compare(sa, sb); if (a is IComparable ia) return ia.CompareTo(b); if (b is IComparable ib) return -ib.CompareTo(a); throw new ArgumentException(SR.Argument_ImplementIComparable); } } }