Csharp/C Sharp/Class Interface/IComparable — различия между версиями
Admin (обсуждение | вклад) м (1 версия) |
|
(нет различий)
|
Версия 18:31, 26 мая 2010
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>