2009-04-08 16 views
10

Was ist der beste Weg, um eine nicht generische Sammlung in eine generische Sammlung zu konvertieren? Gibt es eine Möglichkeit, es LINQ?Die beste Methode, um eine nicht generische Sammlung in generische Sammlung zu konvertieren

Ich habe den folgenden Code.

public class NonGenericCollection:CollectionBase 
{ 
    public void Add(TestClass a) 
    { 
     List.Add(a); 
    } 
} 

public class ConvertTest 
{ 
    public static List<TestClass> ConvertToGenericClass(NonGenericCollection collection) 
    { 
     // Ask for help here. 
    } 
} 

Vielen Dank!

Antwort

22

Da Sie garantieren können sie alle Instanzen Testclass sind, verwenden Sie die LINQ Cast<T> method:

public static List<TestClass> ConvertToGenericClass(NonGenericCollection collection) 
{ 
    return collection.Cast<TestClass>().ToList(); 
} 

Edit: Und wenn Sie nur die Testclass Instanzen einer (möglicherweise) heterogene Sammlung wollte, filtern sie mit OfType <T>:

public static List<TestClass> ConvertToGenericClass(NonGenericCollection collection) 
{ 
    return collection.OfType<TestClass>().ToList(); 
} 
+1

Ich glaube nicht, dass Sie den Cast () nach dem OfType () benötigen, aber ich könnte mich irren. – Samuel

+0

@ Samuel - Du hast Recht. OfType () wird IEnumerable zurückgeben, das ist alles, was Sie benötigen. Bearbeitet und behoben. –

1

Vielleicht nicht der beste Weg, aber es sollte funktionieren.

public class ConvertTest 
{ 
    public static List<TestClass> ConvertToGenericClass(NonGenericCollection collection) throws I 
    { 
     List<TestClass> newList = new ArrayList<TestClass> 
     for (Object object : collection){ 
      if(object instanceof TestClass){ 
       newList.add(object) 
       } else { 
       throw new IllegalArgumentException(); 
       } 
      } 
    return newList; 
    } 
} 
8

Ein anderer eleganter Weg ist, eine Wrapper-Klasse wie diese zu erstellen (ich schließe das in mein Hilfsprojekt ein).

public class EnumerableGenericizer<T> : IEnumerable<T> 
{ 
    public IEnumerable Target { get; set; } 

    public EnumerableGenericizer(IEnumerable target) 
    { 
     Target = target; 
    } 

    IEnumerator IEnumerable.GetEnumerator() 
    { 
     return GetEnumerator(); 
    } 

    public IEnumerator<T> GetEnumerator() 
    { 
     foreach(T item in Target) 
     { 
      yield return item; 
     } 
    } 
} 

Sie können dies jetzt tun:

IEnumerable<MyClass> genericized = 
    new EnumerableGenericizer<MyClass>(nonGenericCollection); 

Sie könnten dann eine normale generische Liste um die genericized Sammlung wickeln.

+0

Diese Lösung ist komplizierter, aber es ist nützlich, ein stärkeres Problem als die Frage und andere Antwort zu lösen. Wenn aus irgendeinem Grund die ursprüngliche Sammlung bekannt ist und von anderen Objekten geändert wird und Sie nur eine generalisierte Sammlung instanziieren möchten, werden zukünftige Änderungen berücksichtigt. Aber Vorsicht. Es verliert einige der höherwertigen Schnittstellen, die für eine effiziente Verarbeitung benötigt werden, zum Beispiel "IList ". Mit anderen Worten, wenn Leistung wichtig ist (z. B. in LINQ-Abfragen), muss sie mit diesen Schnittstellen auf höherer Ebene abgeschlossen werden. –

Verwandte Themen