Как преобразовать 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 в статический массив типа String типа MyStruct. Как я могу это сделать? Мне не повезло с ToArray.
Я использую .NET Framework 2.0.
Решение
Я предполагаю, что, поскольку вы используете ArrayList, вы используете 1.1?
В этом случае, я подозреваю, сработает следующее:
ArrayList list = new ArrayList();
MyStruct[] array = new MyStruct[list.Count];
list.CopyTo(array);
(правка - использование Билла в ToArray более удобно - я не знал об этом, но потом я очень редко (если вообще когда-либо) использую ArrayList)
Однако, если MyStruct действительно является структурой, то я не могу сказать достаточно сильно, что изменяемые структуры - плохая идея, то есть, где вы можете установить .Name и .Content после создания. Структуры почти всегда должны быть неизменными. В действительности ваш MyStruct выглядит так, как будто это должен быть класс. Кроме того - я не & Quot; up & Quot; на VB, но это открытые поля? Опять же - не рекомендуется - свойства будут предпочтительнее. Я не знаю о VB, но C # 3.0 имеет очень краткий синтаксис для этого:
public class SomeType
{
public string Name {get;set;}
public string Content {get;set;}
}
Если вы используете 2.0 или выше, рассмотрите List < T > вместо ArrayList.
Другие советы
Вы должны привести результат ToArray
MyStruct[] structs = (MyStruct[]) alList.ToArray(typeof(MyStruct));
ToArray - правильный путь. В C # это будет:
MyStruct[] array = (MyStruct[]) alList.ToArray(typeof(MyStruct));
Вы застряли, используя 1.1, кстати? Если вы используете 2.0, можете ли вы перейти к списку & Lt; T & Gt; вместо этого?
Это сработало для меня
Dim array As MyStruct() = alList.ToArray(GetType(MyStruct))
Если вы используете Visual Studio 2008, вы можете использовать объект List.
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 и более поздних версиях есть только две причины использовать массив вместо общего списка:
<Ол>IEnumerable<T>, IList<T>, or ICollection<T>
, и очень редко - массив. Наконец, это немного придирчиво, но есть два стилистических момента, которые я хочу затронуть в коде, который вы разместили. Во-первых, обратите внимание на сокращенный синтаксис, который я использовал для создания New List<MyStruct>
. Там нет символа =, и вам не нужно вводить имя типа дважды. Это была поддержка еще в 1.1, так что нет никаких оправданий. Во-вторых, рекомендации по стилю для .Net , опубликованные Microsoft на MSDN ( см. раздел об общих соглашениях об именах ), особенно рекомендованный против венгерских бородавок, например ' о 'или' а '. Это было хорошо для VB6 / VBScript, которые были напечатаны слабо, но .Net строго типизированы, что делает бородавки, ну, в общем, уродливыми.