检查代码。
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。
答案 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(...));