0

我有一个矩形数组,我想按大小降序排列。然后我想选择前 10 个并将其用于另一个接收矩形数组的函数中。下面是我的代码。但是,当我转换回数组时,出现“至少一个对象必须实现 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作为第二个参数。

于 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 回答