Csharp/C Sharp by API/System/IEquatable

Материал из .Net Framework эксперт
Перейти к: навигация, поиск

implements IEquatable

 
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.rupareTo( 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.rupareTo( rhs ) < 0;
    }
    public static bool operator>( Complex lhs, Complex rhs ) {
        return lhs.rupareTo( rhs ) > 0;
    }
    public static bool operator<=( Complex lhs, Complex rhs ) {
        return lhs.rupareTo( rhs ) <= 0;
    }
    public static bool operator>=( Complex lhs, Complex rhs ) {
        return lhs.rupareTo( 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 );
    }
}