2009-04-09 94 views
0

检查代码。泛型子列表

class DynamicObj : BaseObj {} 
class BaseObj {} 

class clientCode 
{ 
    List<DynamicObj> GetFilteredObjs(List<BaseObj> baseList) 
    { 
     // I want to return the sublist of baseList which only have DynamicObj. 
     List<DynamicObj> dList = baseList.FindAll(
              delegate(BaseObj bo){  // Del1 
              return bo is DynamicObj; 
              }).ConvertAll<DynamicObj>(
              delegate(BaseObj bo){  // Del2 
              return bo as DynamicObj; 
              }); 

    } 
} 

现在,它可能是一个愚蠢的问题,但我的代码将要循环对象2次,一次DEL1环和一次DEL2循环。

有没有直路?仅限C#2.0。

回答

2

肯定的:

IEnumerable<DynamicObj> GetDynamicObjects(IEnumerable<BaseObj> baseList) 
{ 
    foreach(BaseObj baseObj in baseList) 
     if(baseObj is DynamicObj) 
      yield return (DynamicObj)baseObj; 
} 

List<DynamicObj> dynamicList = new List<DynamicObj>(GetDynamicObjects(...)); 
2

最简单的方法可能是使用迭代器块:

public IEnumerable<TTarget> FilteredCast<TSource,TTarget> 
    (IEnumerable<TSource> source) 
    where TSource : class 
    where TTarget : class, TSource 
{ 
    foreach (TSource element in source) 
    { 
     TTarget converted = element as TTarget; 
     if (converted != null) 
     { 
      yield return converted; 
     } 
    } 
} 

(这基本上是在LINQ的Enumerable.OfType方法的对象,顺便说一句我已经限制它引用类型的方便,但它仍然是。通用的,因此你可以更容易地重用)

然后只写:

List<DynamicObj> GetFilteredObjs(List<BaseObj> baseList) 
{ 
    return new List<DynamicObj>(FilteredCast<BaseObj,DynamicObj>(baseList); 
} 

注意,这将不会返回空值。如果你想包含空值,你需要明确地满足这个要求。