如何对List<>进行排序包含派生类对象的派生类对象

时间:2016-10-19 00:17:26

标签: c# sorting inheritance

我有一个双重问题。我需要对List<>进行排序我知道包含派生类的对象到该列声明最初包含的类。 AND,我需要通过该派生类中的方法的返回值进行排序,该方法接受一个参数。请记住,我已经知道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 ???
  }
}

1 个答案:

答案 0 :(得分:2)

使用Enumerable.Cast<Fence>扩展程序将IEnumerable<Component>转换为IEnumerable<Fence>。然后我会用你的第二种方法(OrderBy方法)对它进行排序,但这是我的偏好。

List<Fence> sortedFences = MyFences.Cast<Fence>().OrderBy(A => A.Distance(FromX, FromY)).ToList();

如果MyFences中有一个无法强制转换为Fence的对象,则会抛出此方法。如果您希望代码只能传递给Fences,那么这可能就是您想要的。相反,如果您想跳过非Fence成员,可以使用:

List<Fence> sortedFences = MyFences.OfType<Fence>().OrderBy(A => A.Distance(FromX, FromY)).ToList();