ArrayList를 구조 배열로 변환하는 방법은 무엇입니까?
문제
여기에 :
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을 사용하고 있습니다.
해결책
ArrayList를 사용하고 있기 때문에 1.1을 사용하고 있다고 가정합니다.
어떤 경우에는 다음이 효과가 있다고 생각합니다.
ArrayList list = new ArrayList();
MyStruct[] array = new MyStruct[list.Count];
list.CopyTo(array);
(편집 - Bill의 ToArray 사용법이 더 편리합니다 - 나는 그것에 대해 알지 못했지만, 그럼에는 거의 [Arraylist를 사용하지 않는다면).
그러나 MyStruct가 실제로 구조물이라면, 돌연변이가있는 스트러크가 나쁜 생각이라고 충분히 말할 수는 없습니다. 즉, 창조 후 .name 및 .content를 설정할 수 있습니다. 스트러크는 거의 항상 불변이어야합니다. 실제로, 당신의 mystruct는 그것이 수업이어야하는 것처럼 보입니다. 또한 - 나는 VB에서 "UP"가 아니지만 공공 분야입니까? 다시 권장하지 않습니다 - 속성이 바람직합니다. 나는 VB에 대해 잘 모르지만 C# 3.0은 이것에 대해 매우 간결한 구문을 가지고 있습니다.
public class SomeType
{
public string Name {get;set;}
public string Content {get;set;}
}
2.0 이상을 사용하는 경우 목록을 고려하십시오.u003CT> ArrayList 대신.
다른 팁
당신은 결과를 던져야합니다 ToArray
MyStruct[] structs = (MyStruct[]) alList.ToArray(typeof(MyStruct));
ToArray는 올바른 방법입니다. C#에서는 다음과 같습니다.
MyStruct[] array = (MyStruct[]) alList.ToArray(typeof(MyStruct));
1.1, BTW를 사용하여 붙어 있습니까? 2.0을 사용하는 경우 목록으로 전환 할 수 있습니까?u003CT> 대신에?
이것은 나를 위해 효과가있었습니다
Dim array As MyStruct() = alList.ToArray(GetType(MyStruct))
Visual Studio 2008을 실행중인 경우 목록 객체를 사용할 수 있습니다.
Dim alList As New List(Of MyStruct)
alList.Add(oStruct)
2.0 이상을 사용하는 경우 Arraylist를 다음과 같이 정의 할 수 있습니다.
Dim alList as New List(Of MyStruct)()
alList.Add(oStruct)
이렇게하면 배열과 동일한 의미를 제공합니다 (인덱스의 조회, 강력한 타이핑, ienumerable 지원 등).
.NET 2.0에는 일반 목록 대신 배열을 사용하는 데 두 가지 이유가 있습니다.
- 당신은 당신이 가지고있는 항목의 수를 절대적으로 알고 있으며, 카운트가 변경되지 않을 것임을 알고 있습니다. 이것은 놀랍게도 드물다.
- 배열이 필요한 함수를 호출해야합니다. BCL에는 여전히 상당한 수의 이러한 수가 있지만 자신의 코드는 요청해야합니다.
IEnumerable<T>, IList<T>, or ICollection<T>
, 그리고 배열 만 거의 없습니다.
마지막으로, 이것은 일종의 nit-picky이지만, 게시 한 코드에서 다루고 싶은 두 가지 스타일 포인트가 있습니다. 먼저, 내가 작성하는 데 사용한 약어 구문에 주목하십시오. New List<MyStruct>
. 기호가 없으며 유형 이름으로 두 번 키를 키울 필요가 없습니다. 그것은 1.1에서도 지원되었으므로 변명은 없습니다. 둘째, .NET에 대한 스타일 지침 MSDN에 Microsoft가 게시했습니다 (참조 일반 명명 규칙 섹션) 구체적으로 'o'또는 'a'와 같은 헝가리 사마귀를 추천합니다. 느슨하게 입력 된 VB6/VBScript에 좋았지 만 .NET은 강하게 입력되어 사마귀를 사마귀로 만듭니다.