2009-04-24 4 views
52

См. Пример кода ниже. Мне нужен ArrayList как общий список.В .Net, как вы преобразовываете ArrayList в строго типизированный общий список без использования 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

В случае, если вы не уверены в том, что ArrayList содержит только ожидаемые типы, фильтровать их arrayList.OfType () .ToList(). См. Http://stackoverflow.com/a/7845009/52277 –

ответ

102

Попробуйте следующее

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

Это будет работать только, хотя с помощью C# 3.5 компилятора, так как он использует определенные методы расширения, определенные в 3,5 рамки.

+0

Хотя я, конечно, использовал это перед собой, я рассматриваю бокс/unboxing. Не будет ли это отходить от производительности? Иногда я нахожу, что симпатичный код за счет скорости и ресурсов ... –

+6

Это просто следствие того, что вначале он попадает в ArrayList. Просто бросать каждого члена обратно в int - это в значительной степени лучшее, что вы можете сделать с точки зрения производительности. – mquander

+0

@mquander, true, true ... Я просто понял, что for-loop в сообщении OP тоже делает это. =) –

9

Это неэффективно (это делает промежуточный массив излишне), но лаконичен и будет работать на .NET 2.0:

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

Почему это не работает для меня? –

+5

Я сделал 'arrayList.ToArray (typeof (int)) как int []', а потом это сработало спасибо! +1 –

4

Как насчет использования методы расширения?

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