如何对列表进行排序<>通过派生类方法包含派生类对象
本文关键字:派生 类方法 包含 对象 列表 排序 | 更新日期: 2023-09-27 18:13:34
我有一个双重问题。我需要将list <>排序,我知道list <>包含派生类的对象到列表最初声明包含的类。并且,我需要根据该派生类中的方法的返回值进行排序,该方法接受一个参数。请记住,我已经知道List包含所有派生类类型的对象。
我在这里创建了一些示例代码来演示这个问题,因为实际代码不能公开共享。注意,我无法控制这里的基本条件(例如,List<>集合的声明内容是父类,并且它包含派生类的对象,派生类包含一个方法,该方法接受一个参数并返回我需要对集合进行排序的值)。所以,我怀疑我是否能够使用任何需要修改的建议。我认为我需要的是一种方法来指定(强制转换?)列表中真正的内容,以便我可以访问那里定义的方法。但我当然愿意接受其他想法。否则就只能用传统的冒泡排序了。谢谢。
public class Component
{
public int X;
public int Y;
}
public class ComponentList : List<Component>
{
// Other members that deal with Components, generically
}
public class Fence : Component
{
public int Distance(int FromX, int FromY)
{
int returnValue = 0;
// Caluclate distance...
return returnValue;
}
}
public class Yard : Component
{
// Yada yada yada
}
public class MyCode
{
public List<Component> MyFences;
public MyCode(List<Component> Fences, int FromX, int FromY)
{
// Sort the fences by their distance from specified X,Y
Fences.Sort((A as Fence, B as Fence) => A.Distance(FromX, FromY).CompareTo(B.Distance(FromX, FromY)));
// Or
List<Fence> sortedFences = MyFences.OrderBy(A => A.Distance(FromX, FromY)).ToList();
// Or ???
}
}
使用Enumerable.Cast<Fence>
扩展方法将您的IEnumerable<Component>
转换为IEnumerable<Fence>
。然后我将使用您的第二种方法(OrderBy方法)对其进行排序,但这是我的偏好。
List<Fence> sortedFences = MyFences.Cast<Fence>().OrderBy(A => A.Distance(FromX, FromY)).ToList();
如果MyFences中有一个对象不能被强制转换为Fence,则该方法将抛出。如果您希望代码只传递fence,那么这可能就是您想要的。相反,如果您想跳过非fence成员,您可以使用:
List<Fence> sortedFences = MyFences.OfType<Fence>().OrderBy(A => A.Distance(FromX, FromY)).ToList();