gpt4 book ai didi

c# - 比较 "Apple"和 "Orange"对象的列表

转载 作者:太空宇宙 更新时间:2023-11-03 22:42:33 25 4
gpt4 key购买 nike

这更像是一个学术练习,所以我基本上只是想了解当类型不同时如何使用 IComparable。

假设我们有一个水果类,以及派生类“Apple”和“Orange”。假设我想要一份水果 list ,让所有的苹果都排在橙子之前。解决这个问题的最佳方法是什么?

我想你可以让 Fruit 实现接口(interface) IComparable 并为非常子类型放入一堆条件语句,但这对我来说似乎很粗糙并且可能违反了开放/封闭原则。我更感兴趣的是让它以这种方式工作:

public abstract class Fruit : IComparable<Fruit>
{
public abstract int CompareTo(Fruit other);
}

public class Apple : Fruit, IComparable<Orange>
{
public override int CompareTo(Fruit other)
{
if(other is Orange)
{
this.CompareTo((Orange)other);
}
return 0;
}

public virtual int CompareTo(Orange other)
{
return -1;
}
}

public class Orange : Fruit, IComparable<Apple>
{
public override int CompareTo(Fruit other)
{
if (other is Apple)
{
this.CompareTo((Apple)other);
}
return 0;
}

public virtual int CompareTo(Apple other)
{
return 1;
}
}

我的主要目标是让 IComparable 与交叉类型一起工作。我试着加载一个包含各种水果的列表,但可惜它没有排序。也许我对 CompareTo 的返回值的理解有点靠不住。这种方法有希望吗?在任何情况下它可能比显而易见的方法更有用吗?

最佳答案

我觉得感觉有点奇怪,因为没有苹果和橙子的自然顺序。 在这个特定的例子中你更喜欢苹果而不是橘子,但也许下一个人想要的恰恰相反。还是冬天混搭?重点是 Apples 和 Oranges 没有唯一的排序算法,将其构建到 Apples 或 Oranges 甚至 Fruit 中感觉是错误的。

那就是IComparer进来了。你可以把你的比较逻辑放在那里,但是你可以有很多比较器,并在你做的每一种排序中选择另一个。因此,您为冬天实现了一个 ApplesFirstComparer,然后实现了一个 OrangesWithTheMostOrangeColorOnTopDoNotCareForColorOfApplesComparer,一个又一个。基本上每个比较你需要一个,并不意味着苹果和橘子有一个自然的顺序。因为他们没有。

关于c# - 比较 "Apple"和 "Orange"对象的列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51534766/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com