using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Text; namespace Net3_Proxy { public static class Tuple { public static Tuple Create(T1 i1, T2 i2) => new Tuple(i1, i2); internal static int CombineHashCodes(int h1, int h2) { return (h1 << 5) + h1 ^ h2; } } [Serializable] public class Tuple : IComparable { public T1 Item1 { get; private set; } public T2 Item2 { get; private set; } public Tuple(T1 item1, T2 item2) { Item1 = item1; Item2 = item2; } public override bool Equals(object obj) => obj is Tuple tup && Equals(Item1, tup.Item1) && Equals(Item2, tup.Item2); int IComparable.CompareTo(object obj) { if (obj == null) return 1; var tup = obj as Tuple; if (tup == null) throw new ArgumentException($"Argument must be of type {GetType()}.", "other"); int num = Comparer.Default.Compare(Item1, tup.Item1); if (num != 0) return num; return Comparer.Default.Compare(Item2, tup.Item2); } public override int GetHashCode() => Tuple.CombineHashCodes(EqualityComparer.Default.GetHashCode(Item1), EqualityComparer.Default.GetHashCode(Item2)); public override string ToString() => $"({Item1}, {Item2})"; } }