Вот у меня:
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 мог бы быть классом, но поскольку у него нет метода, я полагаю, что быстрее просто использовать структуру ?!
Нет; это не разница между структурами и классами. У структур могут быть методы в .NET; разница в типе ссылки и типе значения.
Так вы бы посоветовали использовать класс, даже если у меня всего два поля?
Абсолютно. Существует множество различных описаний разницы между структурой и классом - вот только одно: pobox.com/~skeet/csharp/parameters.html





Вы должны привести результат 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>.
Я почти уверен, что VB.NET может использовать дженерики; В MSDN есть пример VB здесь: msdn.microsoft.com/en-us/library/6sh2ey19.aspx
Получил с помощью List (Of MyStruct).
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).
Если вы используете 2.0 или более позднюю версию, вы можете определить свой arrayylist следующим образом:
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 (см. Раздел общие соглашения об именах), специально рекомендует против венгерских бородавок, таких как «o» или «a». Это было хорошо для VB6 / VBScript, которые были слабо типизированы, но .Net строго типизирован, что делает бородавки, ну, уродливыми.
Я не могу вас заставить - но пожалуйста обратите внимание, насколько MyStruct должен быть классом, а не структурой. Это имеет тенденцию вызывать путаницу много, особенно для изменяемых типов (таких как ваш).