C#排序类型层次结构

3

我有一个存储在列表中的多种类型,我需要将它们按照从最具体的类型到最一般的类型进行排序,例如:

Vehicle
  Car
  Bike

Person
  Manager
  Programmer

因此,它使用车辆、汽车、自行车、人、经理和程序员等类型进行列表。现在我需要获得排序列表,其中更具体的类型始终在更一般的类型之前,如:汽车、自行车、车辆、经理、程序员、人。是否有一些简单/优雅的方法来实现这一点,而不是通过Type.IsAssignableFrom进行某些高难度操作?


1
所以按优先级排序?车辆=1,汽车、自行车=2。人员=1,经理、程序员=2? - Adam
1
你会如何区分 VehiclePerson?为什么你的示例结果中 Vehicle 排在首位? - Jashaszun
2
你是否了解Type.BaseType (https://msdn.microsoft.com/zh-cn/library/system.type.basetype(v=vs.110).aspx)? - Preston Guillot
1
当你有基本类型时,(简化的)拓扑排序将完成其余部分。 - Adriano Repetti
Preston和Adriano是正确的。在这里使用BaseType对边进行拓扑排序是正确的答案。 - Ed T
2个回答

7
一种简单的方法是,假设每个子类必须比其父类在层次结构中具有更多的类,因此可以按照每个类型层次结构中有多少类来排序:
var types = new[] {
    typeof(Vehicle),
    typeof(Car),
    typeof(Bike),
    typeof(Person),
    typeof(Manager),
    typeof(Programmer)
};
var ordered = types.OrderByDescending(t => GetHierarchy(t).Count());

使用这个:

private static IEnumerable<Type> GetHierarchy(Type type)
{
    while (type != null) {
        yield return type;
        type = type.BaseType;
    }
}

class Vehicle {}
  class Car : Vehicle{}
  class Bike : Vehicle{}

class Person {}
  class Manager : Person{}
  class Programmer : Person{}

看起来像是一个简单快速的解决方案,如果需要的话可以进行优化,谢谢! - Jarek

0

正如Adam Pointed和Jashaszun所说,您需要一个公共字段来设置类型类的优先级,因为Car和Bike在继承中处于同一级别,您必须决定哪个具有最高优先级。

在这种情况下,如果您将所有类放在同一集合中,并且这些类可以从不同的根类型(车辆或人员)继承,则可以定义一个名为IPrioritySort的接口,其中包含一个名为Priority Integer的属性,并为每个不同的类设置值(如果它对某种类型的所有对象都相同,则可以是静态的),并使用它来对集合进行排序。

如果您解释一下您将通过此方法实现什么,那将很好,以便我们了解解决方案是否符合我们的想法,或者是否还有其他问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接