我有一个矩形数组,我想按尺寸降序排序。然后我想选择前10并在另一个接收矩形数组的函数中使用它。以下是我的代码。但是,当我转换回数组时,我得到了“至少有一个对象必须实现IComparable”的例外。有人可以指导我。
Rectangle[] BoundingBoxes = GetRectangles(param1, param2);
IEnumerable<Rectangle> BoundingBoxesSorted = BoundingBoxes.OrderByDescending(
item => item.Size).Take(10);
Rectangle[] BoundingBoxes10 = BoundingBoxesSorted.Cast<Rectangle>().ToArray();
答案 0 :(得分:5)
那是因为System.Drawing.Size
(Rectangle.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;
}
}