如何将ArrayList转换为结构数组?

时间:2008-10-09 16:56:39

标签: c# .net vb.net arrays arraylist

我在这里:

Public Structure MyStruct
   Public Name as String
   Public Content as String
End Structure

Dim oStruct as MyStruct = New MyStruct()
oStruct.Name = ...
oStruct.Content = ...

Dim alList as ArrayList = new ArrayList()
alList.Add(oStruct)

我想将ArrayList转换为类型为MyStruct的静态强类型数组。我怎样才能做到这一点?我对ToArray没有运气。

我正在使用.NET Framework 2.0。

6 个答案:

答案 0 :(得分:4)

您必须投射ToArray

的结果
MyStruct[] structs = (MyStruct[]) alList.ToArray(typeof(MyStruct));

答案 1 :(得分:1)

我假设你使用的是ArrayList,你使用的是1.1?

在这种情况下,我怀疑以下内容会起作用:

ArrayList list = new ArrayList();
MyStruct[] array = new MyStruct[list.Count];
list.CopyTo(array); 

(编辑 - 比尔的ToArray使用更方便 - 我不知道那个,但是,我很少[如果曾经]使用ArrayList)

但是,如果MyStruct确实是一个结构,那么我不能强烈地说可变结构是一个坏主意 - 即你可以在创建之后设置.Name和.Content。结构应该几乎总是不可变的。实际上,你的MyStruct看起来应该是一个类。另外 - 我不是在VB上“起来”,但他们是公共领域吗?再次 - 不推荐 - 属性会更好。我不知道VB,但C#3.0有一些非常简洁的语法:

public class SomeType
{
    public string Name {get;set;}
    public string Content {get;set;}
}

如果您使用的是2.0或更高版本,请考虑列表< T>而不是ArrayList。

答案 2 :(得分:1)

ToArray是正确的方法。在C#中它将是:

MyStruct[] array = (MyStruct[]) alList.ToArray(typeof(MyStruct));

你是否坚持使用1.1,顺便说一下?如果你使用2.0,你可以转移到List< T>代替?

答案 3 :(得分:0)

这对我有用

Dim array As MyStruct() = alList.ToArray(GetType(MyStruct))

答案 4 :(得分:0)

如果您运行的是Visual Studio 2008,则可以使用List对象。

  Dim alList As New List(Of MyStruct)
  alList.Add(oStruct)

答案 5 :(得分:0)

如果你使用的是2.0或更高版本,你可能想要像这样定义你的arraylist:

Dim alList as New List(Of MyStruct)()
alList.Add(oStruct)

这将为您提供与数组相同的语义(通过索引查找,强类型,IEnumerable支持等)。

.Net 2.0及更高版本中只有两个原因使用数组而不是通用列表:

  1. 您绝对肯定地知道您拥有的物品数量,并且知道计数不会改变。这种情况非常罕见。
  2. 您需要调用需要数组的函数。在BCL中仍有相当多的潜伏,但你自己的代码应该要求IEnumerable<T>, IList<T>, or ICollection<T>,而且很少有数组。
  3. 最后,这有点挑剔,但我想在你发布的代码中解决两个风格点。首先,请注意我用于创建New List<MyStruct>的缩写语法。没有=符号,您不必两次键入类型名称。这也是1.1的支持,所以那里没有任何借口。其次,微软在MSDN上发布的style guidelines for .Net(参见general naming conventions部分)特别推荐对抗'o'或'a'等匈牙利疣。这对于VB6 / VBScript来说很不错,它们的类型很松散,但是.Net是强类型的,使得疣很好,哇哇哇哇。