| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677 |
- // 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;
- string sb = b as string;
- if (sa != null && sb != null)
- return _compareInfo.Compare(sa, sb);
- IComparable ia = a as IComparable;
- if (ia != null)
- return ia.CompareTo(b);
- IComparable ib = b as IComparable;
- if (ib != null)
- return -ib.CompareTo(a);
- throw new ArgumentException(SR.Argument_ImplementIComparable);
- }
- }
- }
|