Csharp/C Sharp/Class Interface/IComparable — различия между версиями

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

Текущая версия на 11:38, 26 мая 2010

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.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);
    }
}


Implements IComparable

 
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);
        }
    }
}