Comparer.cs 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. //
  2. // System.Collections.Comparer.cs
  3. //
  4. // Author:
  5. // Sergey Chaban ([email protected])
  6. //
  7. using System.Globalization;
  8. namespace System.Collections
  9. {
  10. [Serializable]
  11. public sealed class Comparer : IComparer
  12. {
  13. public static readonly Comparer Default = new Comparer ();
  14. #if NET_1_1
  15. public
  16. #else
  17. internal
  18. #endif
  19. static readonly Comparer DefaultInvariant = new Comparer (CultureInfo.InvariantCulture);
  20. CultureInfo _culture;
  21. private Comparer ()
  22. {
  23. //LAMESPEC: This seems to be encoded at runtime while CaseInsensitiveComparer does at creation
  24. }
  25. #if NET_1_1
  26. public
  27. #else
  28. internal
  29. #endif
  30. Comparer (CultureInfo culture)
  31. {
  32. if (culture == null)
  33. throw new ArgumentNullException ("culture");
  34. _culture = culture;
  35. }
  36. // IComparer
  37. public int Compare (object a, object b)
  38. {
  39. if (a == b)
  40. return 0;
  41. else if (a == null)
  42. return -1;
  43. else if (b == null)
  44. return 1;
  45. if (_culture != null) {
  46. string sa = a as string;
  47. string sb = b as string;
  48. if (sa != null && sb != null)
  49. return _culture.CompareInfo.Compare (sa, sb);
  50. }
  51. if (a is IComparable)
  52. return (a as IComparable).CompareTo (b);
  53. else if (b is IComparable)
  54. return -(b as IComparable).CompareTo (a);
  55. throw new ArgumentException (Locale.GetText ("Neither a nor b Comparable."));
  56. }
  57. }
  58. }