2009-04-09 96 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); 
} 

注意,這將不會返回空值。如果你想包含空值,你需要明確地滿足這個要求。