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

5

我这里有:

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。

我不能强迫你,但是请注意我的MyStruct应该是一个类而不是结构体。这往往会导致很多混淆,特别是对于可变类型(像你的类型)。 - Marc Gravell
MyStruct本来可以是一个类,但由于它没有方法,我想直接使用结构体可能会更快? - Vincent
1
不是的;那不是struct和class之间的区别。在.NET中,struct可以具有方法;区别在于引用类型与值类型。 - Marc Gravell
那么您建议即使我只有两个字段,也使用类吗? - Vincent
1
当然可以。关于结构体和类之间的区别有很多描述 - 这里只是其中之一:http://www.pobox.com/~skeet/csharp/parameters.html - Marc Gravell
6个回答

4

您需要将ToArray的结果转换

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

1

我猜测既然您在使用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.0或更高版本,请考虑使用List<T>而不是ArrayList。


我不知道ArrayList是1.1版本。问题是我需要在VB.NET中编写代码,所以我不确定能否使用List<T>。 - Vincent
我非常确定VB.NET可以使用泛型;MSDN在这里提供了一个VB示例:http://msdn.microsoft.com/en-us/library/6sh2ey19.aspx - Marc Gravell
我使用了List(Of MyStruct)来实现。 - Vincent

1

ToArray 是正确的方法。在 C# 中,它应该是:

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

你卡在1.1上了吗?如果你在使用2.0,能否改用List<T>?


0

这对我有用

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

0

如果您正在运行Visual Studio 2008,您可以使用List对象。

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

你也可以在 .Net 2.0 (vs2005) 中完成这个操作。 - Joel Coehoorn

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>, 或 ICollection<T>,并且仅在极少数情况下才需要数组。

最後,這可能有點挑剔,但我想提到你發布的代碼中有兩個風格上的問題。首先,請注意我用來創建 New List<MyStruct> 的簡寫語法。沒有 = 符號,也不必兩次鍵入類型名稱。這在 1.1 中也得到了支持,所以沒有任何借口。其次,由微軟在 MSDN 上發布的 .Net 風格指南(參見通用命名慣例部分)特別建議避免使用匈牙利式命名法,例如 'o' 或 'a'。這對於 VB6/VBScript 很好,因為它們是弱類型的,但 .Net 是強類型的,使這些命名方式看起來很醜陋。


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