Как преобразовать 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.

Я не могу вас заставить - но пожалуйста обратите внимание, насколько MyStruct должен быть классом, а не структурой. Это имеет тенденцию вызывать путаницу много, особенно для изменяемых типов (таких как ваш).

Marc Gravell 09.10.2008 21:08

MyStruct мог бы быть классом, но поскольку у него нет метода, я полагаю, что быстрее просто использовать структуру ?!

Vincent 09.10.2008 21:09

Нет; это не разница между структурами и классами. У структур могут быть методы в .NET; разница в типе ссылки и типе значения.

Marc Gravell 09.10.2008 21:11

Так вы бы посоветовали использовать класс, даже если у меня всего два поля?

Vincent 09.10.2008 21:14

Абсолютно. Существует множество различных описаний разницы между структурой и классом - вот только одно: pobox.com/~skeet/csharp/parameters.html

Marc Gravell 09.10.2008 21:51
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
5
5
6 696
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Вы должны привести результат ToArray

MyStruct[] structs = (MyStruct[]) alList.ToArray(typeof(MyStruct));
Ответ принят как подходящий

Я предполагаю, что, поскольку вы используете 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 <T> вместо ArrayList.

Я не знал, что ArrayList был 1.1. Проблема в том, что мне нужно закодировать его в VB.NET, поэтому я не уверен, что могу использовать List <T>.

Vincent 09.10.2008 21:04

Я почти уверен, что VB.NET может использовать дженерики; В MSDN есть пример VB здесь: msdn.microsoft.com/en-us/library/6sh2ey19.aspx

Marc Gravell 09.10.2008 21:06

Получил с помощью List (Of MyStruct).

Vincent 09.10.2008 21:07

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

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

Кстати, вы застряли на 1.1? Если вы используете 2.0, можете ли вы вместо этого перейти на List <T>?

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

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

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

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

Вы можете сделать это и в .Net 2.0 (vs2005).

Joel Coehoorn 16.11.2008 06:38

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

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 строго типизирован, что делает бородавки, ну, уродливыми.

Другие вопросы по теме