Как преобразовать ArrayList в массив структуры? - PullRequest
5 голосов
/ 09 октября 2008

Здесь у меня есть:

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.

Ответы [ 6 ]

4 голосов
/ 09 октября 2008

Вы должны разыграть результат ToArray

MyStruct[] structs = (MyStruct[]) alList.ToArray(typeof(MyStruct));
1 голос
/ 09 октября 2008

ToArray - правильный путь. В C # это будет:

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

Вы застряли, используя 1.1, кстати? Если вы используете 2.0, можете ли вы перейти к списку вместо?

1 голос
/ 09 октября 2008

Я предполагаю, что, поскольку вы используете ArrayList, вы используете 1.1?

В этом случае, я подозреваю, сработает следующее:

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

(правка - использование Билла в 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.

0 голосов
/ 09 октября 2008

В случае, если вы используете 2.0 или более позднюю версию, вы можете определить свой arraylist следующим образом:

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

Это даст вам ту же семантику, что и у массива (поиск по индексу, строгая типизация, поддержка IEnumerable и т. Д.).

В .Net 2.0 и более поздних версиях есть только две причины использовать массив вместо общего списка:

  1. Вы точно знаете, сколько предметов у вас есть, и знаете, что количество не изменится. Это удивительно редко.
  2. Вам необходимо вызвать функцию, для которой требуется массив. В BCL их все еще довольно много, но ваш собственный код должен запрашивать IEnumerable<T>, IList<T>, or ICollection<T>, и лишь в редких случаях - массив.

Наконец, это немного придирчиво, но есть два стилистических момента, которые я хочу затронуть в коде, который вы разместили. Во-первых, обратите внимание на сокращенный синтаксис, который я использовал для создания New List<MyStruct>. Там нет символа =, и вам не нужно вводить имя типа дважды. Это была поддержка еще в 1.1, так что нет никаких оправданий. Во-вторых, руководящие принципы стиля для .Net , опубликованные Microsoft на MSDN (см. Раздел общие соглашения об именах ), особенно рекомендуют против венгерских бородавок, таких как 'o' или 'a'. Это было хорошо для VB6 / VBScript, которые были напечатаны слабо, но .Net строго типизированы, что делает бородавки, ну, в общем, уродливыми.

0 голосов
/ 09 октября 2008

Если вы работаете в Visual Studio 2008, вы можете использовать объект List.

  Dim alList As New List(Of MyStruct)
  alList.Add(oStruct)
0 голосов
/ 09 октября 2008

Это сработало для меня

Dim array As MyStruct() = alList.ToArray(GetType(MyStruct))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...