如何将 ArrayList 转换为结构数组?
Posted
技术标签:
【中文标题】如何将 ArrayList 转换为结构数组?【英文标题】:How to convert ArrayList to an array of structure? 【发布时间】:2010-09-16 08:02:26 【问题描述】:这里有:
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 应该是一个类,而不是一个结构。这往往会导致很多混乱,尤其是对于可变类型(比如你的)。 MyStruct 本来可以是一个类,但是由于它没有方法,我想只使用一个结构会更快吗?! 否;这不是结构和类之间的区别。结构可以在 .NET 中有方法;区别在于引用类型与值类型。 所以你会建议使用一个类,即使我只有两个字段? 当然。结构和类之间差异的各种描述比比皆是 - 这里只是一个:pobox.com/~skeet/csharp/parameters.html 【参考方案1】:你必须转换ToArray
的结果
MyStruct[] structs = (MyStruct[]) alList.ToArray(typeof(MyStruct));
【讨论】:
【参考方案2】:我假设既然你使用的是 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
【讨论】:
我不知道 ArrayList 是 1.1。问题是我需要在 VB.NET 中对其进行编码,所以我不确定是否可以使用 ListToArray 是正确的方法。在 C# 中是:
MyStruct[] array = (MyStruct[]) alList.ToArray(typeof(MyStruct));
顺便说一句,您还在使用 1.1 吗?如果您使用的是 2.0,您可以改用 List
【讨论】:
【参考方案4】:这对我有用
Dim array As MyStruct() = alList.ToArray(GetType(MyStruct))
【讨论】:
【参考方案5】:如果您运行的是 Visual Studio 2008,则可以使用 List 对象。
Dim alList As New List(Of MyStruct)
alList.Add(oStruct)
【讨论】:
您也可以在 .Net 2.0 (vs2005) 中执行此操作。【参考方案6】:如果您使用的是 2.0 或更高版本,您可能希望像这样定义您的数组列表:
Dim alList as New List(Of MyStruct)()
alList.Add(oStruct)
这将为您提供与数组相同的语义(按索引查找、强类型、IEnumerable 支持等)。
在 .Net 2.0 及更高版本中使用数组而不是通用列表只有两个原因:
-
您绝对知道您拥有的物品数量,并且知道数量不会改变。这非常罕见。
您需要调用一个需要数组的函数。在 BCL 中仍有相当多的此类代码,但您自己的代码应该要求
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 是强类型的,这使得疣,嗯,丑陋。
【讨论】:
以上是关于如何将 ArrayList 转换为结构数组?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用java和jsp和extjs将java arraylist转换为json数组存储数据