2013-04-22 96 views
0

說我有一個包含狗,貓等的c#中的動物集合...我如何獲得基本集合中所有屬於狗的所有項目,以便我可以執行對所有狗物品的其他操作,就好像它們在它們自己的單獨集合中一樣,就好像它們在List<Dog>(並且對象也在基本集合中更新一樣)?從基礎集合中獲取對象的專門集合

對於代碼答案,假設List<Animals>已足夠,因爲如果可能的話,我想避免implementing my own generic collection

編輯:我剛剛注意到這個問題是非常相似的c# collection inheritance

+1

看起來像這個問題涵蓋了它,任何你不能使用'OfType'的原因? – 2013-04-22 08:16:02

回答

1

剛剛宣佈在基類基本方法,像

public class Base { 

    List<Animals> animals = .... 
    ... 
    .... 

    public IEnumerable<T> GetChildrenOfType<T>() 
     where T : Animals 
    { 
     return animals.OfType<T>(); // using System.Linq; 
    } 
} 

類似的東西。你應該自然地改變這個以適應你的確切需求。

+3

這不會編譯。我想你的意思是'公共IEnumerable GetChildrenOfType (){return animals.OfType (); }'。那個基類從哪裏來? – 2013-04-22 08:23:22

+0

@DanielHilgarth:謝謝,糾正。 – Tigran 2013-04-22 08:27:16

+0

您只更正了三個錯誤中的一個。 – 2013-04-22 08:27:45

0
List<Dog> dogList = new List<Dog>(); 
foreach(Animal a in animals) { //animals is your animal list 
    if(a.GetType() == typeof(Dog)) { //check if the current Animal (a) is a dog 
     dogList.Add(a as Dog); //add the dog to the dogList 
    } 
} 
+0

爲什麼不使用'OfType'? – 2013-04-22 08:21:08

+0

當然,你可以使用OfType,但我從來沒有使用它,所以我使用typeof()和GetType()。 – 2013-04-22 08:22:51

+0

這對'class SpecialDog:Dog'不起作用,而空引用將拋出,而OfType ()確實處理得好 – Firo 2013-04-22 08:52:23

2

關於其他海報和使用OfType,你可以做;

List<Dog> dogList = new List<Dog>(); 

foreach(Animal a in animals.OfType<Dog>()) 
    { 
     //Do stuff with your dogs here, for example; 
     dogList.Add(a); 
    } 

現在,您已將所有的狗列入單獨列表中,或者您想要對它們進行任何操作。這些狗也將仍然存在於你的基地收藏。

+0

OfType在缺少OfType後。什麼原因不使用'List dogList = animals.OfType ().ToList()'? – Firo 2013-04-22 08:50:06

+0

對不起,免費打字。你也可以這樣做。我想這種方式可以讓你對狗做其他的事情,如果你想不止添加到另一個列表。但公平點。 – 2013-04-22 08:51:33