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

C# 如何将ArrayList转换为结构数组?,c#,.net,vb.net,arrays,arraylist,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) 我想将Arr

我有:

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。

您必须将
的结果强制转换为Array

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

我假设您使用的是ArrayList,那么您使用的是1.1

在这种情况下,我认为以下方法可行:

ArrayList list = new ArrayList();
MyStruct[] array = new MyStruct[list.Count];
list.CopyTo(array); 
(编辑-Bill的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或以上,考虑列表而不是ARARYLIST。

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

MyStruct[] array = (MyStruct[]) alList.ToArray(typeof(MyStruct));
顺便说一句,你是否坚持使用1.1?如果您使用的是2.0,您可以改为使用列表吗?

这对我很有用

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

如果您正在运行VisualStudio2008,则可以使用列表对象

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

如果您使用的是2.0或更高版本,您可能希望如下定义arraylist:

Dim alList as New List(Of MyStruct)()
alList.Add(oStruct)
这将为您提供与数组相同的语义(按索引查找、强类型、IEnumerable支持等)

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

  • 你绝对肯定地知道你拥有的物品数量,并且知道数量不会改变。这是非常罕见的
  • 您需要调用需要数组的函数。BCL中仍然隐藏着相当数量的这些,但是您自己的代码应该要求
    IEnumerable、IList或ICollection
    ,而且很少需要数组

  • 最后,这有点吹毛求疵,但我想在您发布的代码中指出两个风格点。首先,请注意我用来创建
    新列表的缩写语法。没有=符号,您不必输入两次类型名称。这也是1.1中的支持,所以没有任何借口。其次,微软在MSDN上发布的报告(见章节)特别建议不要使用“o”或“a”等匈牙利疣。VB6/VBScript的类型很松散,但.Net是强类型的,这使得缺点很难看。

    我不知道ArrayList是1.1。问题是我需要在VB.NET中编写它,所以我不确定我是否可以使用List;MSDN在这里有一个VB示例:我用List(MyStruct的)得到了它。我不能让你-但请注意MyStruct应该是一个类,而不是一个结构。这往往会造成很多混乱,尤其是对于可变类型(如您的)。MyStruct可能是一个类,但由于它没有方法,我认为只使用struct更快?!不这不是结构和类之间的区别。结构可以在.NET中有方法;区别在于引用类型和值类型。所以你会建议使用类,即使我只有两个字段?当然。关于结构和类之间差异的各种描述比比皆是——这里只有一个:您也可以在.NET2.0(vs2005)中这样做。