|
■No76875 (魔界の仮面弁士) に追記 > とりあえず、VS2010 世代のコードに書き換えてみました。
続いて、VS2005 世代のコード。
using System;
/// <summary> /// 2次元上の点。 /// <see cref="IComparable{T}"/> を実装している = 順序をつけられる。 /// </summary> class Point2D : IComparable<Point2D> { private double x, y; public double X { get { return x; } } public double Y { get { return y; } }
public Point2D(double x, double y) { this.x = x; this.y = y; }
public double Radius { get { return Math.Sqrt(X * X + Y * Y); } } public double Angle { get { return Math.Atan2(Y, X); } }
/// <summary> /// 距離で順序を決める。 /// 距離が全く同じなら偏角で順序付け。 /// </summary> /// <param name="other"></param> /// <returns></returns> public int CompareTo(Point2D other) { int r = Radius.CompareTo(other.Radius); if (r != 0) return r; return Angle.CompareTo(other.Angle); } }
class IComparableSample { public static void Main() { const int N = 5; Random rand = new Random(); Point2D[] data = new Point2D[N]; for (int i = 0; i < N; i++) { data[i] = new Point2D(rand.NextDouble(), rand.NextDouble()); }
Console.WriteLine("元:"); Array.ForEach(data, WriteLine); // 並べ替えの順序に使える Console.WriteLine("整列済み:"); Array.Sort(data); Array.ForEach(data, WriteLine); }
private static void WriteLine(Point2D p) { Console.WriteLine("({0:N3}, {1:N3}), radius = {2:N3}, angle = {3:N3}", p.X, p.Y, p.Radius, p.Angle); } }
|