You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

93 lines
2.9 KiB

  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Text;
  6. namespace Net3_Proxy
  7. {
  8. public static class Tuple
  9. {
  10. public static Tuple<T1, T2> Create<T1, T2>(T1 i1, T2 i2)
  11. => new Tuple<T1, T2>(i1, i2);
  12. internal static int CombineHashCodes(int h1, int h2)
  13. {
  14. return (h1 << 5) + h1 ^ h2;
  15. }
  16. }
  17. [Serializable]
  18. public class Tuple<T1, T2> : IComparable, IComparable<Tuple<T1, T2>>
  19. {
  20. public T1 Item1 { get; private set; }
  21. public T2 Item2 { get; private set; }
  22. public Tuple(T1 item1, T2 item2)
  23. {
  24. Item1 = item1;
  25. Item2 = item2;
  26. }
  27. public override bool Equals(object obj)
  28. => obj is Tuple<T1, T2> tup
  29. && Equals(Item1, tup.Item1)
  30. && Equals(Item2, tup.Item2);
  31. int IComparable.CompareTo(object obj)
  32. {
  33. if (obj == null) return 1;
  34. var tup = obj as Tuple<T1, T2>;
  35. if (tup == null) throw new ArgumentException($"Argument must be of type {GetType()}.", "other");
  36. return CompareTo(tup);
  37. }
  38. public override int GetHashCode() =>
  39. Tuple.CombineHashCodes(EqualityComparer<T1>.Default.GetHashCode(Item1), EqualityComparer<T2>.Default.GetHashCode(Item2));
  40. public override string ToString() =>
  41. $"({Item1}, {Item2})";
  42. public int CompareTo(Tuple<T1, T2> tup)
  43. {
  44. int num = Comparer<T1>.Default.Compare(Item1, tup.Item1);
  45. if (num != 0) return num;
  46. return Comparer<T2>.Default.Compare(Item2, tup.Item2);
  47. }
  48. public static bool operator ==(Tuple<T1, T2> left, Tuple<T1, T2> right)
  49. {
  50. if (ReferenceEquals(left, null))
  51. {
  52. return ReferenceEquals(right, null);
  53. }
  54. return left.Equals(right);
  55. }
  56. public static bool operator !=(Tuple<T1, T2> left, Tuple<T1, T2> right)
  57. {
  58. return !(left == right);
  59. }
  60. public static bool operator <(Tuple<T1, T2> left, Tuple<T1, T2> right)
  61. {
  62. return ReferenceEquals(left, null) ? !ReferenceEquals(right, null) : left.CompareTo(right) < 0;
  63. }
  64. public static bool operator <=(Tuple<T1, T2> left, Tuple<T1, T2> right)
  65. {
  66. return ReferenceEquals(left, null) || left.CompareTo(right) <= 0;
  67. }
  68. public static bool operator >(Tuple<T1, T2> left, Tuple<T1, T2> right)
  69. {
  70. return !ReferenceEquals(left, null) && left.CompareTo(right) > 0;
  71. }
  72. public static bool operator >=(Tuple<T1, T2> left, Tuple<T1, T2> right)
  73. {
  74. return ReferenceEquals(left, null) ? ReferenceEquals(right, null) : left.CompareTo(right) >= 0;
  75. }
  76. }
  77. }