按大小排序矩形数组

时间:2013-01-19 19:53:40

标签: c# linq

我有一个矩形数组,我想按尺寸降序排序。然后我想选择前10并在另一个接收矩形数组的函数中使用它。以下是我的代码。但是,当我转换回数组时,我得到了“至少有一个对象必须实现IComparable”的例外。有人可以指导我。

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

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

3 个答案:

答案 0 :(得分:5)

那是因为System.Drawing.SizeRectangle.Size的类型)没有实现IComparable。这是有道理的,因为(Width, Height)之类的数字元组没有自然排序:(10, 5)会小于(7, 8)吗?

选择具有可比性的内容(例如仅Width或区域Width * Height),或者将自定义IComparer作为第二个参数传递。

答案 1 :(得分: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);

答案 2 :(得分: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;
    }
 }