C# 排序类型层次结构
C# Sorting Type hierarchy
我有多个类型存储在一个列表中,我需要将它们从最具体的类型排序到最一般的类型,示例:
Vehicle
Car
Bike
Person
Manager
Programmer
所以它列出了:车辆、汽车、自行车、人员、经理、程序员类型。现在我需要获得有序列表,其中更具体的类型总是在更一般的类型之前,例如:汽车、自行车、车辆、经理、程序员、人员。除了一些 Type.IsAssignableFrom 的体操之外,还有什么 simple/elegant 方法可以实现这一目标吗?
一种简单的方法是计算出每个子 class 在其层次结构中的 class 必须比其父级多,因此您可以按 class 的数量排序在每种类型的层次结构中:
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{}
正如 Adam Pointed 和 Jashaszun 所说,您需要一个公共字段来设置类型的优先级 class,因为 Car 和 Bike 在继承中都处于同一级别,您必须决定哪个具有最高优先级。
在这种情况下,如果所有 classes 都在同一个 collection 中,并且 classes 可以继承自不同的根类型(车辆或人)
您可以使用 属性 优先级整数定义接口 IPrioritySort 并为每个不同的 class 设置值(如果某种类型的所有 objects 都相同,则它可以是静态的)并用它来排序你的 collection.
如果您能解释一下您将通过此实现的目标,以了解解决方案是否符合我们的想法,或者是否存在其他问题,那就太好了。
我有多个类型存储在一个列表中,我需要将它们从最具体的类型排序到最一般的类型,示例:
Vehicle
Car
Bike
Person
Manager
Programmer
所以它列出了:车辆、汽车、自行车、人员、经理、程序员类型。现在我需要获得有序列表,其中更具体的类型总是在更一般的类型之前,例如:汽车、自行车、车辆、经理、程序员、人员。除了一些 Type.IsAssignableFrom 的体操之外,还有什么 simple/elegant 方法可以实现这一目标吗?
一种简单的方法是计算出每个子 class 在其层次结构中的 class 必须比其父级多,因此您可以按 class 的数量排序在每种类型的层次结构中:
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{}
正如 Adam Pointed 和 Jashaszun 所说,您需要一个公共字段来设置类型的优先级 class,因为 Car 和 Bike 在继承中都处于同一级别,您必须决定哪个具有最高优先级。
在这种情况下,如果所有 classes 都在同一个 collection 中,并且 classes 可以继承自不同的根类型(车辆或人) 您可以使用 属性 优先级整数定义接口 IPrioritySort 并为每个不同的 class 设置值(如果某种类型的所有 objects 都相同,则它可以是静态的)并用它来排序你的 collection.
如果您能解释一下您将通过此实现的目标,以了解解决方案是否符合我们的想法,或者是否存在其他问题,那就太好了。