我的容器对象包含一个私有的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 :(得分:4)
你正在重新发明BCL已经提供的轮子。使用OfType<T>
过滤混合列表以查找给定具体类型的项目。
var concretes = _abc.OfType<ConcreteClass>().ToList();
答案 1 :(得分:0)
我建议:
public IEnumerable<ConcreteClass> ConcreteList
{
get
{
foreach (a in _abc)
{
ConcreteClass c = a as ConcreteClass;
if (c != null)
yield return c;
}
}
}
你避免使用双重转换,我认为最好返回IEnumerable而不是List,这样调用者就不会认为可以修改返回的值。