2004-05-01 Andreas Nahr <ClassDevelopment@A-SoftTech.com>
[mono.git] / mcs / class / corlib / System.Collections / CaseInsensitiveComparer.cs
1 //
2 // System.Collections.CaseInsensitiveComparer.cs
3 //
4 // Authors:
5 //   Sergey Chaban (serge@wildwestsoftware.com)
6 //   Eduardo Garcia Cebollero (kiwnix@yahoo.es)
7 //   Andreas Nahr (ClassDevelopment@A-SoftTech.com)
8 //
9
10 using System.Globalization;
11
12 namespace System.Collections
13 {
14         [Serializable]
15         public class CaseInsensitiveComparer : IComparer
16         {
17                 private static CaseInsensitiveComparer defaultComparer = new CaseInsensitiveComparer ();
18                 private static CaseInsensitiveComparer defaultInvariantComparer = new CaseInsensitiveComparer (true);
19
20                 private CultureInfo culture;
21
22                 // Public instance constructor
23                 public CaseInsensitiveComparer ()
24                 {
25                         //LAMESPEC: This seems to be encoded while the object is created while Comparer does this at runtime.
26                         culture = CultureInfo.CurrentCulture;
27                 }
28
29                 private CaseInsensitiveComparer (bool invariant)
30                 {
31                         // leave culture == null
32                 }
33
34                 public CaseInsensitiveComparer (CultureInfo culture)
35                 {
36                         if (culture == null)
37                                 throw new ArgumentNullException ("culture");
38
39                         if (culture.LCID != CultureInfo.InvariantCulture.LCID)
40                                 this.culture = culture;
41                         // else leave culture == null
42                 }
43
44                 //
45                 // Public static properties
46                 //
47                 public static CaseInsensitiveComparer Default {
48                         get {
49                                 return defaultComparer;
50                         }
51                 }
52
53 #if NET_1_1
54                 public
55 #else
56                 internal
57 #endif
58                 static CaseInsensitiveComparer DefaultInvariant {
59                         get {
60                                 return defaultInvariantComparer;
61                         }
62                 }
63
64                 //
65                 // IComparer
66                 //
67                 public int Compare (object a, object b)
68                 {
69                         string sa = a as string;
70                         string sb = b as string;
71
72                         if ((sa != null) && (sb != null)) {
73                                 if (culture != null)
74                                         return culture.CompareInfo.Compare (sa, sb, CompareOptions.IgnoreCase);
75                                 else
76                                         // FIXME: We should call directly into an invariant compare once available in string
77                                         return CultureInfo.InvariantCulture.CompareInfo.Compare (sa, sb, CompareOptions.IgnoreCase);
78                         }
79                         else
80                                 return Comparer.Default.Compare (a, b);
81                 }
82         }
83 }