C# 如何对列表进行排序<&燃气轮机;通过派生类方法包含派生类对象的

C# 如何对列表进行排序<&燃气轮机;通过派生类方法包含派生类对象的,c#,sorting,inheritance,C#,Sorting,Inheritance,我这里有双重问题。我需要将我知道包含派生类对象的列表排序为该列表最初声明包含的类。而且,我需要根据派生类中方法的返回值进行排序,该派生类接受一个参数。请记住,我已经知道该列表包含所有派生类类型的对象 我在这里创建了一些示例代码来演示这个问题,因为真正的代码不能公开共享。注意,我无法控制这里的基本条件(即,列表集合的声明内容是父类,并且它包含派生类的对象,派生类包含一个接受参数并返回我需要按其对集合排序的值的方法)。所以,我怀疑我是否能够使用任何需要修改的建议。我想我需要的是一种方法来指定(cas

我这里有双重问题。我需要将我知道包含派生类对象的列表排序为该列表最初声明包含的类。而且,我需要根据派生类中方法的返回值进行排序,该派生类接受一个参数。请记住,我已经知道该列表包含所有派生类类型的对象

我在这里创建了一些示例代码来演示这个问题,因为真正的代码不能公开共享。注意,我无法控制这里的基本条件(即,列表集合的声明内容是父类,并且它包含派生类的对象,派生类包含一个接受参数并返回我需要按其对集合排序的值的方法)。所以,我怀疑我是否能够使用任何需要修改的建议。我想我需要的是一种方法来指定(cast?)列表中真正的内容,这样我就可以访问其中定义的方法。但我肯定会有其他想法。否则我只剩下传统的泡泡式了。谢谢

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 ???
  }
}
公共类组件
{
公共int X;
公共智力;
}
公共类组件列表:列表
{
//处理组件的其他成员,一般来说
}
公共类围栏:组件
{
公共整数距离(整数距x,整数距y)
{
int返回值=0;
//Caluclate距离。。。
返回值;
}
}
公共类堆场:组件
{
//雅达雅达雅达
}
公共类MyCode
{
公开名单;
公共MyCode(列出围栏,int-FromX,int-FromY)
{
//根据围栏与指定X,Y的距离对其进行排序
Fences.Sort((A作为Fences,B作为Fences)=>A.Distance(FromX,FromY)。CompareTo(B.Distance(FromX,FromY));
//或
List sortedFences=MyFences.OrderBy(A=>A.Distance(FromX,FromY)).ToList();
//还是???
}
}

使用
Enumerable.Cast
扩展方法将
IEnumerable
转换为
IEnumerable
。然后我会使用您的第二种方法(OrderBy方法)对其进行排序,但这是我的首选

List<Fence> sortedFences = MyFences.Cast<Fence>().OrderBy(A => A.Distance(FromX, FromY)).ToList();
List sortedFences=MyFences.Cast().OrderBy(A=>A.Distance(FromX,FromY)).ToList();
如果MyFences中存在无法强制转换到Fence的对象,此方法将抛出。如果您希望代码只能通过围栏传递,那么这可能就是您想要的。如果要跳过非围栏成员,可以使用:

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

使用
Enumerable.Cast
扩展方法将
IEnumerable
转换为
IEnumerable
。然后我会使用您的第二种方法(OrderBy方法)对其进行排序,但这是我的首选

List<Fence> sortedFences = MyFences.Cast<Fence>().OrderBy(A => A.Distance(FromX, FromY)).ToList();
List sortedFences=MyFences.Cast().OrderBy(A=>A.Distance(FromX,FromY)).ToList();
如果MyFences中存在无法强制转换到Fence的对象,此方法将抛出。如果您希望代码只能通过围栏传递,那么这可能就是您想要的。如果要跳过非围栏成员,可以使用:

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

铸造有什么问题?或者您只是不知道强制转换的语法-?当
Fences
实际上包含一个不是围栏的对象时会发生什么?强制转换有什么问题?或者你只是不知道cast的语法-?当
Fences
实际上包含一个不是fence的对象时会发生什么?这就是我需要的cast技巧。谢谢我原以为我需要一些类型的演员,但根本不知道这一点。这就是…一件美丽的事情。这是我需要的铸造技巧。谢谢我原以为我需要一些类型的演员,但根本不知道这一点。这就是…一件美丽的事情。