Mega Code Archive

 
Categories / C# / Class Interface
 

Implement ICloneable, IComparable

using System; using System.Runtime.Serialization; using System.Collections; public class ComplexOverflowException : ApplicationException {     public ComplexOverflowException() :         base() {     }     public ComplexOverflowException(string msg) :         base(msg) {     }     public ComplexOverflowException(SerializationInfo info, StreamingContext cxt) :         base(info, cxt) {     }     public ComplexOverflowException(string msg, Exception inner) :         base(msg, inner) {     } } public class Complex : ICloneable, IComparable {     private double realPart = 0.0;     private double imagPart = 0.0;     public Complex() {     }     public Complex(double r) : this(r, 0) {     }     public Complex(double r, double i) {         realPart = r;         imagPart = i;     }     public Complex(Complex l) {         realPart = l.realPart;         imagPart = l.imagPart;     }     public double Imaginary {         get {             return imagPart;         }         set {             imagPart = value;         }     }     public double Real {         get {             return realPart;         }         set {             realPart = value;         }     }     public void Scale(double val) {         double tempImaginary = val * imagPart;         realPart *= val;         imagPart = tempImaginary;     }     static public Complex operator +(Complex l, Complex r) {         Complex result = new Complex(l);         result.realPart += r.realPart;         result.imagPart += r.imagPart;         return result;     }     static public Complex operator *(Complex l, Complex r) {         Complex result = new Complex();         checked {             result.Real = l.Real * r.Real - l.Imaginary * r.Imaginary;             result.Imaginary = l.Real * r.Imaginary + l.Imaginary * r.Real;         }         return result;     }     static public bool operator ==(Complex l, Complex r) {         return ((l.Real == r.Real) &&             (l.Imaginary == r.Imaginary));     }     static public bool operator !=(Complex l, Complex r) {         return !(l == r);     }     static public bool operator >(Complex l, Complex r) {         double normL = l.imagPart * l.imagPart + l.realPart * l.realPart;         double normR = r.imagPart * r.imagPart + r.realPart * r.realPart;         return normL > normR;     }     static public bool operator <(Complex l, Complex r) {         return r > l;     }     public override bool Equals(object o) {         if (!(o is Complex))             return false;         Complex c = (Complex)o;         return ((c.Real == Real) && (c.Imaginary == Imaginary));     }     public override int GetHashCode() {         return (int)(Real + Imaginary);     }     object ICloneable.Clone() {         return new Complex(this);     }     int IComparable.CompareTo(object o) {         if (!(o is Complex))             throw new ArgumentException("Object is not a complex number");         Complex c = (Complex)o;         double norm = imagPart * imagPart + realPart * realPart;         double normO = c.imagPart * c.imagPart + c.realPart * c.realPart;         if (norm > normO)             return 1;         else if (normO > norm)             return -1;         else             return 0;     } } class MainClass {     public static IComparable theMax(IComparable seed, IEnumerable coll) {         foreach (IComparable c in coll) {             if (c.CompareTo(seed) > 0) {                 seed = c;             }         }         return seed;     }     static void Main(string[] args) {         Complex[] cArray = new Complex[100];         Complex max = new Complex(0, 0);         max = (Complex)theMax(max, cArray);     } }