2009-04-24 15 views
52

Zobacz przykładowy kod poniżej. Potrzebuję, aby ArrayList była ogólną listą.W .Net, w jaki sposób można przekonwertować ArrayList na listę typowo generowaną bez używania foreach?

ArrayList arrayList = GetArrayListOfInts(); 
List<int> intList = new List<int>(); 

//Can this foreach be condensed into one line? 
foreach (int number in arrayList) 
{ 
    intList.Add(number); 
} 
return intList;  
+0

W przypadku, gdy nie jesteśmy pewni, że ArrayList zawiera tylko oczekiwane typy, filtrować je arrayList.OfType () .ToList(). Zobacz http://stackoverflow.com/a/7845009/52277 –

Odpowiedz

102

Wypróbuj następujące

var list = arrayList.Cast<int>().ToList(); 

ta będzie działać tylko jeśli za pomocą kompilatora C# 3.5, ponieważ korzysta z niektórych metod rozszerzenie zdefiniowanych w 3.5 Framework.

+0

Chociaż na pewno użyłem tego przed sobą, rozważam boksowanie/rozpakowywanie. Czy to nie spowoduje wycofania się z wydajności? Czasami uważam, że ładny kod odbywa się kosztem szybkości i zasobów ... –

+6

To tylko konsekwencja umieszczenia go w ArrayList w pierwszej kolejności. Rzucanie każdego członka z powrotem na int jest prawie najlepsze, co możesz zrobić z punktu widzenia wydajności. – mquander

+0

@mquander, prawda, prawda ... Właśnie zdałem sobie sprawę, że pętla for w poście OP robi to samo. =) –

9

To jest nieefektywne (to sprawia, że ​​pośrednią tablicę niepotrzebnie), ale jest zwięzły i będzie działać na .NET 2.0:

List<int> newList = new List<int>(arrayList.ToArray(typeof(int))); 
+0

Dlaczego to nie działa dla mnie? –

+5

Zrobiłem 'arrayList.ToArray (typeof (int)) jako int []', a następnie zadziałało dzięki! +1 –

4

Jak o użyciu metodę rozszerzenia?

Od http://www.dotnetperls.com/convert-arraylist-list:

using System; 
using System.Collections; 
using System.Collections.Generic; 

static class Extensions 
{ 
    /// <summary> 
    /// Convert ArrayList to List. 
    /// </summary> 
    public static List<T> ToList<T>(this ArrayList arrayList) 
    { 
     List<T> list = new List<T>(arrayList.Count); 
     foreach (T instance in arrayList) 
     { 
      list.Add(instance); 
     } 
     return list; 
    } 
}