泛型子列表

时间:2009-04-09 07:14:15

标签: c# generics c#-2.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 个答案:

答案 0 :(得分: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 to Objects中的Enumerable.OfType方法,顺便说一句。为方便起见,我将其限制为引用类型,但它仍然是通用的,因此您可以更轻松地重用它。)

然后写下:

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

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

答案 1 :(得分: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(...));