using System;
public struct Complex : IComparable, IEquatable<Complex>, IComparable<Complex>{
public Complex( double real, double img ) {
this.real = real;
this.img = img;
}
public override bool Equals( object other ) {
bool result = false;
if( other is Complex ) {
result = Equals( (Complex) other );
}
return result;
}
public bool Equals( Complex that ) {
return (this.real == that.real && this.img == that.img);
}
public override int GetHashCode() {
return (int) this.Magnitude;
}
public int CompareTo( Complex that ) {
int result;
if( Equals( that ) ) {
result = 0;
} else if( this.Magnitude > that.Magnitude ) {
result = 1;
} else {
result = -1;
}
return result;
}
int IComparable.CompareTo( object other ) {
if( !(other is Complex) ) {
throw new ArgumentException( "Bad Comparison" );
}
return CompareTo( (Complex) other );
}
public override string ToString() {
return String.Format( "({0}, {1})", real, img );
}
public double Magnitude {
get {
return Math.Sqrt( Math.Pow(this.real, 2) + Math.Pow(this.img, 2) );
}
}
public static bool operator==( Complex lhs, Complex rhs ) {
return lhs.Equals( rhs );
}
public static bool operator!=( Complex lhs, Complex rhs ) {
return !lhs.Equals( rhs );
}
public static bool operator<( Complex lhs, Complex rhs ) {
return lhs.CompareTo( rhs ) < 0;
}
public static bool operator>( Complex lhs, Complex rhs ) {
return lhs.CompareTo( rhs ) > 0;
}
public static bool operator<=( Complex lhs, Complex rhs ) {
return lhs.CompareTo( rhs ) <= 0;
}
public static bool operator>=( Complex lhs, Complex rhs ) {
return lhs.CompareTo( rhs ) >= 0;
}
private double real;
private double img;
}
public class MainClass
{
static void Main() {
Complex cpx1 = new Complex( 1.0, 3.0 );
Complex cpx2 = new Complex( 1.0, 2.0 );
Console.WriteLine( "cpx1 = {0}, cpx1.Magnitude = {1}", cpx1, cpx1.Magnitude );
Console.WriteLine( "cpx2 = {0}, cpx2.Magnitude = {1}\n", cpx2, cpx2.Magnitude );
Console.WriteLine( "cpx1 == cpx2 ? {0}", cpx1 == cpx2 );
Console.WriteLine( "cpx1 != cpx2 ? {0}", cpx1 != cpx2 );
Console.WriteLine( "cpx1 < cpx2 ? {0}", cpx1 < cpx2 );
Console.WriteLine( "cpx1 > cpx2 ? {0}", cpx1 > cpx2 );
Console.WriteLine( "cpx1 <= cpx2 ? {0}", cpx1 <= cpx2 );
Console.WriteLine( "cpx1 >= cpx2 ? {0}", cpx1 >= cpx2 );
}
}
cpx1 = (1, 3), cpx1.Magnitude = 3.16227766016838
cpx2 = (1, 2), cpx2.Magnitude = 2.23606797749979
cpx1 == cpx2 ? False
cpx1 != cpx2 ? True
cpx1 < cpx2 ? False
cpx1 > cpx2 ? True
cpx1 <= cpx2 ? False
cpx1 >= cpx2 ? True