3 // Copyright (c) Microsoft Corporation. All rights reserved.
6 /*============================================================
10 ** <OWNER>Microsoft</OWNER>
13 ** Purpose: Default IComparer implementation.
16 ===========================================================*/
17 namespace System.Collections {
20 using System.Globalization;
21 using System.Runtime.Serialization;
22 using System.Security.Permissions;
23 using System.Diagnostics.Contracts;
26 [System.Runtime.InteropServices.ComVisible(true)]
27 public sealed class Comparer : IComparer , ISerializable
29 private CompareInfo m_compareInfo;
30 public static readonly Comparer Default = new Comparer(CultureInfo.CurrentCulture);
31 public static readonly Comparer DefaultInvariant = new Comparer(CultureInfo.InvariantCulture);
33 private const String CompareInfoName = "CompareInfo";
39 public Comparer(CultureInfo culture) {
41 throw new ArgumentNullException("culture");
43 Contract.EndContractBlock();
44 m_compareInfo = culture.CompareInfo;
47 private Comparer(SerializationInfo info, StreamingContext context) {
49 SerializationInfoEnumerator enumerator = info.GetEnumerator();
50 while( enumerator.MoveNext()) {
51 switch( enumerator.Name) {
53 m_compareInfo = (CompareInfo) info.GetValue(CompareInfoName, typeof(CompareInfo));
59 // Compares two Objects by calling CompareTo. If a ==
60 // b,0 is returned. If a implements
61 // IComparable, a.CompareTo(b) is returned. If a
62 // doesn't implement IComparable and b does,
63 // -(b.CompareTo(a)) is returned, otherwise an
64 // exception is thrown.
66 public int Compare(Object a, Object b) {
68 if (a == null) return -1;
69 if (b == null) return 1;
70 if (m_compareInfo != null) {
71 String sa = a as String;
72 String sb = b as String;
73 if (sa != null && sb != null)
74 return m_compareInfo.Compare(sa, sb);
77 IComparable ia = a as IComparable;
79 return ia.CompareTo(b);
81 IComparable ib = b as IComparable;
83 return -ib.CompareTo(a);
85 throw new ArgumentException(Environment.GetResourceString("Argument_ImplementIComparable"));
88 [System.Security.SecurityCritical] // auto-generated_required
89 public void GetObjectData(SerializationInfo info, StreamingContext context) {
91 throw new ArgumentNullException("info");
93 Contract.EndContractBlock();
95 if( m_compareInfo != null) {
96 info.AddValue(CompareInfoName, m_compareInfo);