Csharp/C Sharp/Class Interface/IComparable

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

Implement ICloneable, IComparable

<source lang="csharp"> 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.rupareTo(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.rupareTo(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);
   }

}

</source>


Implements IComparable

<source lang="csharp"> using System; using System.Collections; using System.Collections.Generic; using System.Text; class Person : IComparable {

   public string Name;
   public int Age;
   public Person(string name, int age) {
       Name = name;
       Age = age;
   }
   public int CompareTo(object obj) {
       if (obj is Person) {
           Person otherPerson = obj as Person;
           return this.Age - otherPerson.Age;
       } else {
           throw new ArgumentException(
              "Object to compare to is not a Person object.");
       }
   }

} class Program {

   static void Main(string[] args) {
       ArrayList list = new ArrayList();
       list.Add(new Person("A", 30));
       list.Add(new Person("B", 25));
       list.Add(new Person("B", 27));
       list.Add(new Person("E", 22));
       for (int i = 0; i < list.Count; i++) {
           Console.WriteLine("{0} ({1})",
              (list[i] as Person).Name, (list[i] as Person).Age);
       }
       list.Sort();
       for (int i = 0; i < list.Count; i++) {
           Console.WriteLine("{0} ({1})",
              (list[i] as Person).Name, (list[i] as Person).Age);
       }
   }

}

</source>