2012-08-15 17 views
15

Voglio convertire un ArrayList in un List<string> utilizzando LINQ. Ho provato ToList() ma questo approccio non funziona:Convertire 'ArrayList' in 'Elenco <string>' (o 'Elenco <T>') utilizzando LINQ

ArrayList resultsObjects = new ArrayList(); 
List<string> results = resultsObjects.ToList<string>(); 
+0

Possibile duplicato (http://stackoverflow.com/ domande/786.268/in-net-how-do-you-convert-un-arraylist-to-un generico-list-sen-fortemente tipizzato-) –

risposta

23

Il codice realtà mostra un List<ArrayList> piuttosto che un singolo ArrayList. Se sei veramente avuto un solo ArrayList, si sarebbe probabilmente desidera:

ArrayList resultObjects = ...; 
List<string> results = resultObjects.Cast<string>() 
            .ToList(); 

La Cast chiamata è necessario perché ArrayList è debolmente tipizzato - implementa solo IEnumerable, non IEnumerable<T>. Quasi tutti gli operatori LINQ in LINQ to Objects sono basati su IEnumerable<T>.

Ciò presuppone che i valori all'interno dello ArrayList siano realmente stringhe. Se non lo sono, è necessario fornirci ulteriori informazioni su come si desidera convertire ciascun elemento in una stringa.

2

Presumo che la prima riga fosse destinata a ArrayList resultsObjects = new ArrayList();.

Se gli oggetti all'interno del ArrayList sono di un tipo specifico, è possibile utilizzare il metodo di Cast<Type> estensione:

List<string> results = resultsObjects.Cast<string>().ToList(); 

Se ci sono oggetti arbitrari in ArrayList cui si desidera convertire alle stringhe, è possibile utilizzare questo:

List<string> results = resultsObjects.Cast<object>().Select(x => x.ToString()) 
                .ToList(); 
0

È possibile convertire ArrayList elementi object[] array usando ArrayList.ToArray() metho d.

List<ArrayList> resultsObjects = new List<ArrayList>(); 
resultsObjects.Add(new ArrayList() { 10, "BB", 20 }); 
resultsObjects.Add(new ArrayList() { "PP", "QQ" }); 

var list = (from arList in resultsObjects 
         from sr in arList.ToArray() 
         where sr is string 
         select sr.ToString()).ToList(); 
0

È anche possibile utilizzare OfType <> il metodo di LINQ, a seconda se si desidera aumentare un'eccezione se uno degli articoli nel tuo arrayList non è calcinabile al tipo desiderato. Se l'elenco di array contiene oggetti che non sono stringhe, OfType() li ignorerà.

var oldSchoolArrayList = new ArrayList() { "Me", "You", 1.37m }; 
var strings = oldSchoolArrayList.OfType<string>().ToList(); 
foreach (var s in strings) 
    Console.WriteLine(s); 

uscita: [? In .Net, come si fa a convertire un ArrayList ad un elenco generico fortemente tipizzato senza usare un foreach]

Me 
You 
Problemi correlati