2009-04-09 11 views
0

コードを確認してください。Genericsサブリスト

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; 
              }); 

    } 
} 

今、それは愚かな質問かもしれません、しかし、私のコードがループする必要がありますが、一度DEL1ループのため、一度DEL2ループの、2回オブジェクト。

ストレートな方法はありますか? 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方法であり、私は便宜上のタイプを参照するために、それを制限してきたが、それはまだです。 。一般的な、あなたがより簡単にそれを再利用することができますので)

それからちょうど書き:これはNULLを返さないことを

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

注意を。 NULLを含めるには、明示的に対応する必要があります。