2009-04-08 14 views
10

Qual è il modo migliore per convertire una raccolta non generica in una raccolta generica? C'è un modo per LINQ?Il modo migliore per convertire una raccolta non generica in una raccolta generica

Ho il seguente codice.

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

Grazie!

risposta

22

Dal momento che si può garantire che sono tutte le istanze TestClass, utilizzare il LINQ Cast<T> method:

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

Edit: E se si voleva solo le istanze TestClass di un (forse) la raccolta eterogenea, filtrare con OfType <T>:

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

Non penso che sia necessario il Cast () dopo l'OfType (), ma potrei sbagliarmi. – Samuel

+0

@ Samuel - Hai ragione. OfType () restituirà IEnumerable , quindi è tutto ciò che serve. Modificato e risolto. –

1

Forse non è il modo migliore, ma dovrebbe funzionare.

8

Un altro modo elegante è creare una classe wrapper come questa (la includo nel mio progetto di utilità).

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

È ora possibile fare questo:

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

È quindi possibile avvolgere un normale elenco generico intorno alla collezione genericized.

+0

Questa soluzione è più complicata ma è utile per risolvere un problema più forte rispetto alla domanda e ad altre risposte. Quando per qualche motivo la collezione originale è conosciuta e modificata da altri oggetti e si desidera creare un'istanza di un solo cappello di raccolta generico rifletterà le modifiche future. Attenzione, però. Perde alcune delle interfacce di alto livello che potrebbero essere necessarie per un'elaborazione efficiente, ad esempio 'IList '. In altre parole, se le prestazioni sono importanti (ad esempio nelle query LINQ), dovranno essere completate con quelle interfacce di livello superiore. –

Problemi correlati