使用 .Net 将 Arraylist 转换为 List<t>?

12

4个回答

26

如果您使用的是 .NET 3.5 或更高版本,将一个由类型为 T 的对象填充的 ArrayList 转换的最简单方法如下:

List<T> list = arrayList.Cast<T>().ToList();

如果您使用的是3.0或更早版本,则需要自行循环:
List<T> list = new List<T>(arrayList.Count);

foreach(T item in arrayList) list.Add(item);

1
在 .NET 3.0 或更早版本中,您可以使用 List<T> list = new List<T>( (T[])arrayList.ToArray() )。这依赖于 .NET 中数组的协变性,但效率较低,因为它会创建数据的额外副本。 - LBushkin
如果ArrayList是对象类型的混合体,请使用OfType<T>()而不是Cast<T>()。(.NET 3.5或更高版本) - Jerod Houghtelling
@LBushkin,如果不使用ToArray的类型重载返回一个基类Array,我无法让它正常工作。使用new List<T>((T[])arrayList.ToArray(typeof(T)))整天都可以正常工作。 - Marc
1
@mgroves:这不是必需的,但它将确保List<T>使用该初始容量进行初始化,防止在填充过程中可能需要扩展。 - Adam Robinson
1
@Marc:是的,我现在明白了我的错误。数组协变允许string[]转换为object[],但反过来不行。这很有道理,因为从stringobject有一个转换,但从objectstring则不可能。在编译时,编译器无法确定object[]是否真的会成为string[],因此它允许强制转换,但在运行时,它当然会失败。运行时不能让我们将string放入object[]中。执行此转换的正确方法需要使用带有Type参数的重载。对于我的误导,我感到抱歉。 - LBushkin
显示剩余4条评论

4

如果您使用的是.NET 3.5或更高版本,则可以使用Linq。 using System.Linq;

ArrayList arrayList = new ArrayList();
arrayList.Add( 1 );
arrayList.Add( "two" );
arrayList.Add( 3 );

List<int> integers = arrayList.OfType<int>().ToList();

否则,你必须将所有的值复制到一个新的列表中。

2
ArrayList a = new ArrayList();

object[] array = new object[a.Count];

a.CopyTo(array);

List<object> list = new List<object>(array);

否则,你只需对你的ArrayList进行循环,并将其添加到新列表中。

2
如果想要对象 new List<object>(a.ToArray());,可以将其转换为一行代码。 - Marc
对我来说,似乎有点冗长。 - spender
@Marc:他可以使用List<T>,并且仍然可以依靠C#中的数组协变性,通过以下一行代码实现:new List<T>((T[])a.ToArray()); - LBushkin

0

这在 Framework <3.5 中也适用:

Dim al As New ArrayList()
al.Add(1)
al.Add(2)
al.Add(3)
Dim newList As New List(Of Int32)(al.ToArray(GetType(Int32)))

C#

List<int> newList = new List<int>(al.ToArray(typeof(int)));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接