2009-04-24 8 views
52

Voir l'exemple de code ci-dessous. J'ai besoin que le ArrayList soit une liste générique.Dans .Net, comment convertir une ArrayList en une liste générique fortement typée sans utiliser 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

Si vous n'êtes pas sûr que arrayList ne contient que les types attendus, le filtre les arrayList.OfType () .ToList(). Voir http://stackoverflow.com/a/7845009/52277 –

Répondre

102

Effectuez les opérations suivantes

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

Cela ne fonctionnera que si en utilisant le compilateur C# 3.5, car il profite de certaines méthodes d'extension définies dans le cadre 3.5.

+0

Bien que je l'ai certainement utilisé avant moi, je considère la boxe/unboxing. Cela ne se rétractera-t-il pas de la performance? Parfois, je trouve que le joli code est au détriment de la vitesse et des ressources ... –

+6

C'est juste une conséquence de le placer dans une ArrayList en premier lieu. Le simple fait de renvoyer chaque membre à un int est à peu près le meilleur que vous puissiez faire en termes de performances. – mquander

+0

@mquander, vrai, vrai ... Je viens juste de me rendre compte que la boucle for dans le post de l'OP le fait aussi. =) –

9

Ceci est inefficace (il fait un tableau intermédiaire inutilement) mais est concis et fonctionnera sur .NET 2.0:

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

Pourquoi cela ne fonctionne-t-il pas pour moi? –

+5

J'ai fait 'arrayList.ToArray (typeof (int)) comme int []' et ensuite cela a fonctionné merci! +1 –

4

Que diriez-vous à l'aide d'une méthode d'extension?

De 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; 
    } 
} 
Questions connexes