【问题标题】:Implementation of IComparable not orderingIComparable 的实现不排序
【发布时间】: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&lt;int&gt; 值之间没有“自然”比较,因此您需要指定自己的比较。
  • @JonSkeet 我更新了一个可以更好地解释我自己的视觉效果。所有项目都将具有相同的值。
  • 你可能需要实现equals和hashcode stackoverflow.com/questions/1421289/icomparable-and-equals

标签: c# linq icomparable


【解决方案1】:

听起来您不是在尝试订购商品 - 而是更改 Thicknesses 属性的内容,以便所有厚度它们自己按顺序排列。您将分别对每个项目执行此操作。例如:

foreach (var item in published.Items)
{
    item.Thicknesses = item.Thicknesses.OrderBy(t => t.Measurement).ToList();
}

【讨论】:

  • 您好乔恩,感谢您的帮助。我真的只是带着“我在这件事上花了太长时间,我会以凌乱的方式去做”的心态走这条路。循环遍历每个项目并创建具有有序厚度的新副本的混乱方式。我上面的代码最终会吐出 Json,所以不能在前端(容易)完成。你帮助我发现了我的心态哪里出了问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多