0

長方形の配列があり、サイズの降順で並べ替えたいと考えています。次に、トップ 10 を選択し、それを四角形の配列を受け取る別の関数で使用したいと考えています。以下は私のコードです。ただし、配列に戻すと、「少なくとも 1 つのオブジェクトは IComparable を実装する必要があります」という例外が発生します。誰かが私を導くことができますか?

Rectangle[] BoundingBoxes = GetRectangles(param1, param2);   
IEnumerable<Rectangle> BoundingBoxesSorted = BoundingBoxes.OrderByDescending(
                                                 item => item.Size).Take(10);

Rectangle[] BoundingBoxes10 = BoundingBoxesSorted.Cast<Rectangle>().ToArray();
4

3 に答える 3

5

これは、System.Drawing.Size(の型Rectangle.Size) が を実装していないためIComparableです。のような数値のタプルには自然な順序付けがないため、これは理にかなってい(Width, Height)ます。(10, 5)(7, 8)

比較可能なものを選択するか (例: theWidthまたは areaのみWidth * Height)、カスタムIComparerを 2 番目の引数として渡します。

于 2013-01-19T20:00:27.140 に答える
4
IEnumerable<Rectangle> BoundingBoxesSorted = 
                                   BoundingBoxes.OrderBy(r => r.Width * r.Height);

または、カスタム比較子を定義できます

var comparer = Comparer<Size>.Create((s1, s2) => 
                            (s1.Width * s1.Height).CompareTo(s2.Width * s2.Height));

IEnumerable<Rectangle> BoundingBoxesSorted = 
                                       BoundingBoxes.OrderBy(r => r.Size,comparer);
于 2013-01-19T19:57:55.653 に答える
1

比較対象外のため、サイズでのご注文はできません。面積(幅×高さ)でご注文いただけます。

これを試して:

var top10 = BoundingBoxes
   .OrderByDescending(b => b.Width * b.Height)
   .Take(10)
   .ToArray();

Cast列挙はすでに を扱っているため、その必要はないことに注意してくださいRectangles

Rectangleプロパティを持つように拡張することもできAreaます。

 public static class Extensions
 {
    public static int Area(this Rectangle r) 
    {
        return r.Width * r.Height;
    }
 }
于 2013-01-19T20:29:46.223 に答える