2009-04-09 12 views
0

Überprüfen Sie den Code.Generics Unterliste

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

    } 
} 

Jetzt könnte es eine dumme Frage, aber mein Code in einer Schleife 2 mal Objekte haben, einmal für Del1 Schleife und einmal für Del2 Schleife.

Gibt es einen geraden Weg? Nur C# 2.0.

Antwort

2

Sure:

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

Der einfachste Weg ist wahrscheinlich einen Iteratorblock zu verwenden:

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

(Dies ist im Grunde die Enumerable.OfType Methode in LINQ to Objects, btw ich es beschränkt habe Typen für Bequemlichkeit zu verweisen, aber es ist nach wie vor. generic so können Sie es leichter wiederverwenden)

Dann schreiben Sie einfach:.

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

Beachten Sie, dass diese Nullen nicht zurückkehren wird. Wenn Nullen eingeschlossen werden sollen, müssen Sie dies explizit berücksichtigen.