【发布时间】:2020-05-15 23:45:11
【问题描述】:
我在尝试对 Thickness 类的数据进行排序时收到错误“至少一个对象必须实现 IComparable”,但我很难理解如何在这种情况下使用 IComparable 实现排序。或者,老实说,它甚至是什么。这是我的类,实现了 IComparable,但没有排序。任何指导将一如既往地受到赞赏。
public class ColourMatrix
{
public List<Item> Items { get; set; }
public class Item
{
public Colour Colours { get; set; }
public List<Thickness> Thicknesses { get; set; }
}
public class Colour
{
public string Name { get; set; }
}
public class Thickness : IComparable<Thickness>
{
public int CompareTo(Thickness that)
{
return this.Measurement.CompareTo(that.Measurement);
}
public int Measurement { get; set; }
public int StandardColour { get; set; } = 1;
}
}
我需要像这样订购数据。
var orderedItems = published.Items
.OrderBy(n => n.Colours.Name)
.ThenBy(t => t.Thicknesses.Select(x => x.Measurement));
就输出而言,这是它呈现的内容,需要排序的是 4、2、1、3。
| 4 | 2 | 1 | 3 |
red | x | | | |
green | x | | x | x |
blue | x | x | | |
应该是
| 1 | 2 | 3 | 4 |
red | | | | x |
green | x | | x | x |
blue | | x | | x |
其中 x = StandardColour 属性值
【问题讨论】:
-
按尺寸列表排序是什么意思?如果项目 1 的厚度为 { 1, 2, 3 },项目 2 的厚度为 { 2, 3, 1},应该先出现,为什么?
-
@JonSkeet 感谢您的回复。所有测量值都应按数字顺序返回。由于我无法控制的原因,将数据提供给我,例如4,3,1,2。在这种情况下,1,2,3,4 是图表水平轴上的标题,因此它们需要按顺序排列。每种颜色都有相同的标题(但标准颜色的值不同)。
-
这并不能真正回答哪个项目应该是第一个。您想按最大值排序吗?最低?还有什么?如果一件物品有 10 个厚度,而另一件只有 1 个厚度怎么办?还是没有?基本上,两个
IEnumerable<int>值之间没有“自然”比较,因此您需要指定自己的比较。 -
@JonSkeet 我更新了一个可以更好地解释我自己的视觉效果。所有项目都将具有相同的值。
-
你可能需要实现equals和hashcode stackoverflow.com/questions/1421289/icomparable-and-equals
标签: c# linq icomparable