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。

4

6 回答 6

4

你必须转换结果ToArray

MyStruct[] structs = (MyStruct[]) alList.ToArray(typeof(MyStruct));
于 2008-10-09T16:59:50.683 回答
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。

于 2008-10-09T16:59:58.047 回答
1

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

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

顺便说一句,您是否坚持使用 1.1?如果您使用的是 2.0,您可以改用 List<T> 吗?

于 2008-10-09T17:00:54.550 回答
0

这对我有用

Dim array As MyStruct() = alList.ToArray(GetType(MyStruct))
于 2008-10-09T17:04:50.487 回答
0

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

  Dim alList As New List(Of MyStruct)
  alList.Add(oStruct)
于 2008-10-09T17:05:57.410 回答
0

如果您使用的是 2.0 或更高版本,您可能希望像这样定义您的数组列表:

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

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

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

  1. 您可以绝对确定地知道您拥有的物品数量,并且知道数量不会改变。这是非常罕见的。
  2. 您需要调用一个需要数组的函数。在 BCL 中仍然有相当多的这些,但是您自己的代码应该要求IEnumerable<T>, IList<T>, or ICollection<T>,而且很少是数组。

最后,这有点挑剔,但我想在您发布的代码中解决两个风格点。首先,请注意我用来创建New List<MyStruct>. 没有 = 符号,您不必输入类型名称两次。这也是 1.1 中的支持,所以没有任何借口。其次,Microsoft 在 MSDN 上发布的.Net 样式指南(请参阅一般命名约定部分)特别建议不要使用诸如“o”或“a”之类的匈牙利疣。这对 VB6/VBScript 来说很好,它们是松散类型的,但 .Net 是强类型的,这使得疣,嗯,丑陋。

于 2008-10-09T17:07:31.213 回答