2008-10-09 9 views
5

Ở đây tôi có:Làm thế nào để chuyển đổi ArrayList thành một mảng cấu trúc?

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) 

Tôi muốn chuyển đổi ArrayList vào một mảng mạnh mẽ-gõ tĩnh của loại MyStruct. Làm thế nào tôi có thể làm điều đó? Tôi không có may mắn với ToArray.

Tôi đang sử dụng .NET Framework 2.0.

+0

Tôi không thể làm cho bạn - nhưng * xin vui lòng * lưu ý bao nhiêu MyStruct phải là một lớp, không phải là một cấu trúc. Điều này có xu hướng gây ra sự lộn xộn * rất nhiều, đặc biệt là đối với các loại có thể thay đổi (giống như của bạn). –

+0

MyStruct có thể đã là một lớp, nhưng vì nó không có phương pháp, tôi cho rằng nó là nhanh hơn để chỉ sử dụng một cấu trúc ?! – Vincent

+1

Không; đó không phải là sự khác biệt giữa các cấu trúc và các lớp. Structs có thể có các phương thức trong .NET; sự khác biệt là kiểu tham chiếu so với kiểu giá trị. –

Trả lời

1

tôi cho rằng kể từ khi bạn đang sử dụng ArrayList, bạn đang sử dụng 1.1?

Trong trường hợp đó, tôi nghi ngờ những điều sau đây sẽ làm việc:

ArrayList list = new ArrayList(); 
MyStruct[] array = new MyStruct[list.Count]; 
list.CopyTo(array); 

(chỉnh sửa - sử dụng ToArray của Bill là thuận tiện hơn - Tôi không biết về điều đó, nhưng sau đó, tôi rất hiếm khi [nếu bao giờ hết ] sử dụng ArrayList)

Tuy nhiên, nếu MyStruct thực sự là cấu trúc, thì tôi không thể nói đủ mạnh rằng cấu trúc có thể biến đổi là ý tưởng tồi - tức là bạn có thể đặt .Name và .Content sau khi tạo. Cấu trúc nên hầu như luôn luôn là bất biến. Trong thực tế, MyStruct của bạn trông giống như nó phải là một lớp học. Ngoài ra - tôi không "lên" trên VB, nhưng họ là những lĩnh vực công cộng? Một lần nữa - không được khuyến nghị - các thuộc tính sẽ thích hợp hơn. Tôi không biết về VB, nhưng C# 3.0 có một số cú pháp rất ngắn gọn cho việc này:

public class SomeType 
{ 
    public string Name {get;set;} 
    public string Content {get;set;} 
} 

Nếu bạn đang sử dụng 2.0 hoặc cao hơn, hãy xem xét Danh sách <T> thay vì ArrayList.

+0

Tôi không biết ArrayList là 1.1. Vấn đề là tôi cần phải mã nó trong VB.NET, vì vậy tôi không chắc chắn tôi có thể sử dụng Danh sách . – Vincent

+0

Tôi khá chắc chắn rằng VB.NET có thể sử dụng Generics; MSDN có một ví dụ VB ở đây: http://msdn.microsoft.com/en-us/library/6sh2ey19.aspx –

+0

Tôi đã nhận nó với List (Of MyStruct). – Vincent

4

Bạn cần phải đúc kết quả của ToArray

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

ToArray là đúng cách để đi. Trong C# nó sẽ là:

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

Bạn có bị mắc kẹt sử dụng 1,1, btw không? Nếu bạn đang sử dụng 2.0, bạn có thể chuyển sang Danh sách < T> thay thế không?

0

này làm việc cho tôi

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

Nếu bạn đang chạy Visual Studio 2008, bạn có thể sử dụng một đối tượng List.

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

Bạn cũng có thể thực hiện điều này trong .Net 2.0 (vs2005). –

0

Trong trường hợp bạn đang sử dụng 2.0 trở lên, bạn có thể muốn xác định ArrayList của bạn như thế này:

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

này sẽ cung cấp cho bạn những ngữ nghĩa giống như một mảng (tra cứu theo chỉ số, mạnh mẽ gõ, hỗ trợ IEnumerable, vv).

Chỉ có hai lý do trong Net 2.0 và sau đó sử dụng một mảng thay vì một danh sách chung:

  1. Bạn biết một cách chắc chắn tuyệt đối số lượng các mục mà bạn có, và biết rằng số lượng thắng' t thay đổi. Điều này là đáng ngạc nhiên hiếm.
  2. Bạn cần gọi một hàm yêu cầu mảng. Hiện vẫn còn một số công bằng của những ẩn trong BCL, nhưng mã của riêng bạn nên được yêu cầu IEnumerable<T>, IList<T>, or ICollection<T>, và hiếm khi một mảng.

Cuối cùng, đây là loại nit-picky, nhưng có hai điểm phong cách tôi muốn giải quyết trong mã bạn đã đăng. Trước tiên, hãy lưu ý cú pháp viết tắt mà tôi đã sử dụng để tạo New List<MyStruct>. Không có biểu tượng = và bạn không phải nhập tên loại hai lần. Đó là hỗ trợ trở lại trong 1,1 là tốt, vì vậy không có lý do gì ở đó. Thứ hai, các style guidelines for .Net được xuất bản bởi Microsoft trên MSDN (xem phần general naming conventions) đặc biệt khuyên bạn nên chống lại mụn cóc hungarian như 'o' hoặc 'a'. Nó là tốt đẹp cho VB6/VBScript, được gõ lỏng lẻo, nhưng. Net là mạnh mẽ đánh máy, làm cho mụn cóc, tốt, wart-xấu xí.