如何对列表进行排序<>通过派生类方法包含派生类对象

本文关键字:派生 类方法 包含 对象 列表 排序 | 更新日期: 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();