public struct Tuple<T, U, V> : IEquatable<Tuple<T,U, V>>
{
public readonly T First;
public readonly U Second;
public readonly V Third;
public Tuple(T first, U second, V third)
{
First = first;
Second = second;
Third = third;
}
public override bool Equals(object obj)
{
if (obj == null)
return false;
if (this.GetType() != obj.GetType())
return false;
return AreEqual(this,(Tuple<T,U,V>)obj);
}
public bool Equals(Tuple<T, U, V> other)
{
return AreEqual(this,other);
}
private static bool AreEqual(Tuple<T, U, V> a, Tuple<T, U, V> b)
{
if (!a.First.Equals(b.First))
return false;
if (!a.Second.Equals(b.Second))
return false;
if (!a.Third.Equals(b.Third))
return false;
return true;
}
public static bool operator == (Tuple<T,U,V> a, Tuple<T,U,V> b)
{
return AreEqual(a, b);
}
public static bool operator !=(Tuple<T, U, V> a, Tuple<T, U, V> b)
{
return !AreEqual(a, b);
}
public override int GetHashCode()
{
return First.GetHashCode() ^ Second.GetHashCode() ^ Third.GetHashCode();
}
}
public static class Tuple
{
public static Tuple<T, U, V> CreateNew<T,U,V>(T first, U second, V third)
{
return new Tuple<T, U, V>(first, second, third);
}
}