2010-09-08 78 views
3

如果有兩個對象,ObjectA和ObjectB都從AbstractObject繼承,並且繼承AbstractObject的集合。 linq語句看起來像在我選擇特定類型集合中的所有對象的位置。恩。是這樣的:查詢集合中的特定對象類型

var allBs = from b in collection where type == ObjectB select b; 

回答

5

您可以使用Enumerable.OfType

var allBs = collection.OfType<ObjectB>(); 

這給你的所有元素,其中的類型是澆注ObjectB。如果你想要的是ObjectB類型只對象:

var allBs = collection.Select(i => i.GetType() == typeof(ObjectB)); 

,或者:

var allBs = from b in collection 
      where b.GetType() == typeof(ObjectB) 
      select b; 
2

很簡單:

IEnumerable<ObjectB> allBs = collection.OfType<ObjectB>(); 

或者:

IEnumerable<AbstractObject> allBy = from b in collection 
            where b is ObjectB 
            select b; 

的第二個查詢保留相同的枚舉作爲集合的可持續類型,第一個隱含地投射到IEnumerable<ObjectB>

您可以使用這些替代方法將第二個查詢轉換爲IEnumerable<ObjectB>

IEnumerable<ObjectB> allBs = (from b in collection 
           where b is ObjectB 
           select b).Cast<ObjectB>(); 

IEnumerable<ObjectB> allBs = from b in collection 
          where b is ObjectB 
          select b as ObjectB; 
+0

這實際上有一個稍微不同的結果比OP問什麼...... – 2010-09-08 01:19:38

+0

@「裏德·科普塞」 - 我覺得OP是有點曖昧是否是一個類型的所有對象,包括衍生類型或排除派生類型。假設代碼'b是ObjectB',即使'b'是從'ObjectB'派生出來的,我也會用「included」的含義返回true。這是你所做的一點嗎? – Enigmativity 2010-09-08 01:28:30