【发布时间】:2015-08-09 20:58:30
【问题描述】:
例如我有这些类和子类。
class Program
{
static void Main(string[] args)
{
var animals = new List<Animal> { new Wolf {kills = 5},
new Rabbit {name = "Uncle John"},
new Eagle {eyeCount = 1},
new Wolf {kills = 100},
new Rabbit { name = "Human" } };
animals.Sort();
//Suposted to be: Rabbit(Human), Rabbit(Uncle John), Wolf(5), Wolf(100), Eagle(1)
}
}
enum SortOrder { Rabbit, Wolf, Eagle }
abstract class Animal{}
class Wolf : Animal
{
public int kills = 0; //Marked public for simple initialization
}
class Rabbit : Animal
{
public string name = "Funny Little Guy"; //Marked public for simple initialization
}
class Eagle : Animal
{
public byte eyeCount = 2; //Marked public for simple initialization
}
我想对动物列表进行排序。 1) 在相同类型的其他对象中排序(按杀戮排序 Wolves,按名称排序兔子等)2) 对“SortOrder”中的子类组进行排序,因此 Rabbits 在列表中排在第一位,Eagles 在列表中排在最后。
我曾尝试通过实现 IComparable<Animal>, IComparable<Wolf>, IComparable<Rabbit>, IComparable<Eagle> 接口来实现这一点,但这让我无处可去,因为我无法完成这项工作,即使我可以,再添加 1 个子类会导致大量代码工作。
这是我的尝试:
abstract class Animal : IComparable<Animal>, IComparable<Wolf>, IComparable<Rabbit>, IComparable<Eagle>
{
public abstract int CompareTo(Animal other);
public abstract int CompareTo(Wolf other);
public abstract int CompareTo(Rabbit other);
public abstract int CompareTo(Eagle other);
}
class Wolf : Animal
{
public int kills = 0; //Marked public for simple initialization
public override int CompareTo(Animal other) => other.CompareTo(this);
public override int CompareTo(Wolf other) => kills.CompareTo(kills);
public override int CompareTo(Rabbit other) => SortOrder.Wolf.CompareTo(SortOrder.Rabbit);
public override int CompareTo(Eagle other) => SortOrder.Wolf.CompareTo(SortOrder.Eagle);
}
但是通过这种方式我得到了相反的顺序,正如我所说的那样很难添加新的子类。
那么进行这种比较的有效方法是什么?
【问题讨论】:
-
分享你尝试的代码(The IComparable's)
标签: c# sorting compare subclass