2012-03-05 56 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,使主叫方也不会想到,返回值可以修改。