Вопрос

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

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 и более поздних версиях есть только две причины использовать массив вместо общего списка:

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

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top