2009-04-24 2 views
52

Siehe das Codebeispiel unten. Ich brauche die ArrayList, um eine generische Liste zu sein.In .Net, wie konvertieren Sie eine ArrayList in eine stark typisierte generische Liste, ohne eine Foreach zu verwenden?

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

Falls Sie nicht sicher sind, dass Arraylist nur dann zu erwarten Typen enthält, filtern sie arrayList.OfType () .ToList(). Siehe http://stackoverflow.com/a/7845009/52277 –

Antwort

102

Versuchen Sie, die folgenden

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

Dies wird allerdings mit den C# 3.5-Compiler nur funktionieren, weil es in dem 3,5-Rahmen definierten Vorteil bestimmter Erweiterungsmethoden nimmt.

+0

Während ich das sicherlich vor mir selbst benutzt habe, überlege ich Boxen/Unboxing. Wird das nicht von der Performance zurückgenommen? Manchmal finde ich, dass hübscher Code auf Kosten von Geschwindigkeit und Ressourcen geht ... –

+6

Das ist nur eine Konsequenz davon, es in eine ArrayList zu setzen. Nur jedes Mitglied zurück zu einem Int zu werfen, ist so ziemlich das Beste, was man leistungsmäßig tun kann. – mquander

+0

@mquander, true, true ... Ich habe gerade gemerkt, dass die For-Schleife in der Post des OP genau das auch tut. =) –

9

Dies ist ineffizient (es macht einen Zwischen Array unnötig), aber prägnant und auf .NET 2.0 arbeiten:

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

Warum funktioniert das nicht für mich? –

+5

Ich habe 'arrayList.ToArray (typeof (int)) als int []' und dann hat es funktioniert, danke! +1 –

4

Wie wäre eine Erweiterung Methode?

Von 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; 
    } 
} 
Verwandte Themen