2016-10-19 96 views
0

這裏有一個雙重問題。我需要對列表<>進行排序,我知道它包含派生類的對象到列表最初聲明爲包含該列表的類。 AND,我需要根據該派生類中的方法的返回值進行排序,該類使用參數。請記住,我已經知道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

鑄造有什麼問題?或者你只是不知道轉換的語法 - https://msdn.microsoft.com/en-us/library/ms173105.aspx)? –

+1

當「圍欄」確實包含一個不是圍欄的物體時會發生什麼? – Rob

回答

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(); 
+0

這是我需要的鑄造尖端。謝謝!我以爲我需要一些類型的鑄造,但根本不知道這一點。在那裏它是一件美麗的事物。 – PilotMelch

相關問題