2010-02-09 48 views
3

我有一個包含(基類)車輛數組的Fleet類。陣列中的車輛是車輛的小類:平原,火車和汽車。該陣列是私人的,但艦隊類必須提供一種方法來獲取給定類型的車輛。查找C中數組中給定類型的元素#

喜歡的東西:

class Fleet 
{ 
    private Vehicle[] _vehicles; 

    // returns the vehicles of the specified subclass 
    public ???? Get(????) 
    { 
     return ???? 
    } 
} 

Fleet fleet = new Fleet("fleet.def"); 

Trains[] trains = fleet.Get(Trains); // looks clean but isn't possible 
Plains[] plains = fleet.Get<Plains>(); // looks okay but don't know 
             // how to implement 

(我使用數組,但真的可以迭代任何集合類型是罰款)

現在,你可以看到,我完全不知道如何實現這一點。我正在爲Get方法尋找一個優雅的解決方案,效率不是真正的問題。還請說出解決方案中涉及的關鍵技術,以便我可以在我的C#書籍中查找它們...

謝謝!

回答

12

你Fleet.Get()看起來像

public IEnumerable<T> Get<T>() 
{ 
    return _vehicles.OfType<T>(); 
} 
+0

非常感謝DH !看起來很乾淨。現在我可以使用「foreach」(Plain plain in fleet.Get ()){}。我想我也可以使用.ToList()和.ToArray()將結果存儲在一個變量中嗎? 什麼是這種技術與尖括號調用(是的,我是一個n00b,而不是它的慚愧)? –

+0

這就是所謂的泛型。這個想法是用一個具體類型替代重用(例如,當你有不同類型的操作類似)。在http://msdn.microsoft.com/en-us/library/0x6a29h6.aspx –

+0

中介紹更多泛型簡介嗯,這是一個相當通用的名稱,對於這樣一個特定的事情:-)再次感謝,我有一些閱讀做... –

1

將其設爲List<>並使用FindAll(x => x.GetType() == typeof(Train))從列表中獲取所有Train對象。

+0

尼斯回答,請記住以正確格式codez :) –

+0

感謝Gerrie,我會記住下一次:d –

0
public T[] Get<T>() where T : Vehicle 
{ 
    List<Vehicle> lstVehicles = new List<Vehicle>(_vehicles); 
    return lstVehicles.FindAll(delegate(Vehicle vehicle){ 
     return vehicle.GetType() == typeof(T); 
    }).ToArray(); 
}