2009-04-08 34 views
10

Genel olmayan bir koleksiyonu genel bir koleksiyona dönüştürmenin en iyi yolu nedir? LINQ için bir yolu var mı?Genel olmayan bir koleksiyonu genel koleksiyona dönüştürmenin en iyi yolu

Aşağıdaki kodum var.

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

Teşekkürler!

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

Edit: Eğer hepsi TestClass örneklerini konum garanti edemez beri

cevap

22

, LINQ Cast<T> method kullanmak sadece bir (muhtemelen) heterojen koleksiyonun TestClass örneklerini isteseydi, OfType < T ile filtre >:

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

OfType () 'den sonra Cast () öğesine gereksinim duyduğunuzu düşünmüyorum, ancak yanılmış olabilirim. – Samuel

+0

@Samuel - Haklısınız. OfType () IEnumerable 'u döndürecek, dolayısıyla ihtiyacınız olan tek şey budur. Düzenlendi ve düzeltildi. –

1

Belki de en iyi yol değil, ama işe yaramalı.

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

Böyle bir sarmalayıcı sınıf oluşturmanın bir başka zarif yolu da (bunu programlarım projemde ekliyorum).

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

Artık yapabilirsiniz:

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

Ardından genericized koleksiyonu etrafında normal bir genel liste sarabilirdiniz.

+0

Bu çözüm daha karmaşıktır ancak soru ve diğer cevaplardan daha güçlü bir sorunu çözmek için kullanışlıdır. Bazı nedenlerden ötürü, orijinal koleksiyon diğer bazı nesneler tarafından bilinir ve değiştirilir ve sadece bir jenerikleştirilmiş koleksiyon şapkası oluşturmak istersiniz. Gelecekteki değişiklikleri yansıtacaktır. Yine de dikkat et. Verimli işleme için gerekli olabilecek daha yüksek seviyedeki arayüzlerden bazılarını kaybeder, örneğin, "IList ". Diğer bir deyişle, performans önemliyse (örneğin LINQ sorgularında), daha yüksek seviyeli arayüzlerle doldurulması gerekecektir. –

İlgili konular