我在这里:
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。
答案 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及更高版本中只有两个原因使用数组而不是通用列表:
IEnumerable<T>, IList<T>, or ICollection<T>
,而且很少有数组。最后,这有点挑剔,但我想在你发布的代码中解决两个风格点。首先,请注意我用于创建New List<MyStruct>
的缩写语法。没有=符号,您不必两次键入类型名称。这也是1.1的支持,所以那里没有任何借口。其次,微软在MSDN上发布的style guidelines for .Net(参见general naming conventions部分)特别推荐对抗'o'或'a'等匈牙利疣。这对于VB6 / VBScript来说很不错,它们的类型很松散,但是.Net是强类型的,使得疣很好,哇哇哇哇。