如何将 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。

【讨论】:

我不知道 ArrayList 是 1.1。问题是我需要在 VB.NET 中对其进行编码,所以我不确定是否可以使用 List. 我很确定 VB.NET 可以使用泛型; MSDN 这里有一个 VB 示例:msdn.microsoft.com/en-us/library/6sh2ey19.aspx 我用 List(Of MyStruct) 得到了它。【参考方案3】:

ToArray 是正确的方法。在 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 转换为结构数组?的主要内容,如果未能解决你的问题,请参考以下文章

将字符串数组转换为 ArrayList [重复]

将 ArrayList 转换为特定类型的数组 [重复]

如何使用java和jsp和extjs将java arraylist转换为json数组存储数据

怎么将arraylist转换为字符串数组

如何在 Kotlin 中将字符串数组 JSON 转换为 ArrayList?

我需要将 Array 转换为 ArrayList 帮助,不知道该怎么做? [复制]