2012-03-05 31 views
0

我的容器對象包含專用的List<AbstractBaseClass>和幾個從AbstractBaseClass派生的具體類型的公共列表。對象通過Add(AbstractBaseClass ABC)方法通過引用AbstractBaseClass添加到容器類中。從抽象引用列表中生成具體對象的列表

公共列表被從LINQ查詢生成上請求

public List<ConcreteClass> ConcreteList 
{ 
    get 
    { 
     return 
      from a in _abc 
      Where a is ConcreteClass 
      select(a as ConcreteClass) 
    } 
} 

這是一個可以接受的方法?對象是否在此處投入ConcreteClass兩次,效率不高。

+0

需要考慮的事項:[是或是不是?](http://blogs.msdn.com/b/ericlippert/archive/2010/09/16/is-is-as-or-is- as-is.aspx) – 2012-03-05 15:47:50

回答

4

您正在重塑BCL已經提供的車輪。使用OfType<T>篩選混合列表以查找給定具體類型的項目。

var concretes = _abc.OfType<ConcreteClass>().ToList(); 
+0

看起來不錯,謝謝 – 2012-03-05 15:52:10

+0

這個答案解決了眼前的問題;然而,朝更具體的類型鑄造往往是一種代碼味道。 – FMM 2012-03-05 18:15:46

0

我建議:

public IEnumerable<ConcreteClass> ConcreteList 
{ 
    get 
    { 
     foreach (a in _abc) 
     { 
      ConcreteClass c = a as ConcreteClass; 
      if (c != null) 
      yield return c; 
     } 
    } 
} 

您避免雙投,我覺得這是更好地比列表,而不是返回一個IEnumerable,使主叫方也不會想到,返回值可以修改。