我有一个双重问题。我需要对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 ???
}
}
答案 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();