Список (Of T) советов по производительности - PullRequest
0 голосов
/ 31 января 2011

Меня соблазнил использовать список (Of T) в VB.NET вместо ArrayLists кем-то, кого нельзя называть Робинсоном.

По сути, мне нужно сохранить три вещи: одну строку, два целых числа и, возможно, два логических значения. Мне понравилось использование ArrayList, потому что он рассматривал все свои элементы как «Объекты», поэтому у меня действительно не было проблем с хранением этого множества элементов.

Но теперь я думал об использовании List (Of T). Но как мне сделать, чтобы хранить это разнообразие моих элементов? Я думал о том, чтобы сделать Structure с пятью элементами.

Звучит как хорошая идея? Я где-то слышал, что у структур, как ожидается, будет короткая жизнь. Но я боюсь, что у меня будут свои структуры на ... навсегда, до тех пор, пока живет мое приложение. Имеет ли это какое-то значение?

Наконец, что если мне нужно создать ... не знаю ... 125 000 000 списков, каждый из которых содержит структуру? Это возможно (и хорошо)?

Ответы [ 2 ]

4 голосов
/ 31 января 2011

Если вы используете тип коллекции (ArrayList или List(Of T)) только потому, что вы ищете место для хранения фиксированного количества совершенно разных типов, остановитесь!Вы находитесь на правильном пути в создании структуры, хотя то, что вы ищете, называется class.

Поскольку из ваших других вопросов звучит так, будто вы создаете редактор карт,Я предполагаю, что ваши два числа - это координаты X и Y, и я предполагаю, что строка - это какое-то имя?Если это так, то очень просто:

Public Class Tile 
    Public Property Name as String
    Public Property X as Integer
    Public Property Y as Integer
End Class

(Обратите внимание, что вышесказанное будет работать только в том случае, если вы используете Visual Studio 2010 и .NET 4; если нет, ответьте, и я отредактирую с предварительным 4совместимая версия)

Вам будет гораздо проще ссылаться на свойства .X и .Y, чем просто разбрасывать индексы повсюду.Это также будет на намного * на 1014 * быстрее (и занимать меньше памяти), чем делать это.

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

1 голос
/ 31 января 2011

Я бы определенно отказался от использования ArrayList.Зачем?Поскольку с момента появления дженериков в .NET версии 2.0, которая была довольно давно, строго типизированный List(Of T) занял свое место в большинстве практических целей.

Даже в вашем случае я бы посоветовал противArrayList, потому что у вас может быть намного лучшая и более легкодоступная структура данных - например, такая как:

Structure CompositeValue  ' or declare this as Class instead; see comment below!
    Public Property SomeString() As String
    Public Property FirstInteger() As Integer
    Public Property SecondInteger() As Integer
    Public Property MaybeFirstBoolean() As Nullable(Of Boolean)
    Public Property MaybeSecondBoolean() As Nullable(Of Boolean)
End Structure
' Note that the above is the syntax for auto properties, which were introduced
' with VB.NET 10 / VS 2010.

Преимущества: Таким образом, вы выиграли 'например, нужно помнить, в какой позиции в ArrayList находится строка или второе целочисленное значение;компилятор сможет убедиться, что вы обращаетесь к свойству, к которому, по вашему мнению, вы обращаетесь.Кроме того, ваш код будет намного легче читать и понимать.


Начиная с .NET 4, вы также можете использовать Tuple(Of String, Integer, Integer, Nullable(Of Boolean), Nullable(Of Boolean)):

Dim myCompositeValue = Tuple.Create("Foo", 1, 2, True, False)

Однако позвольте мне сказать, что кортежи не обладают всеми преимуществами, которые имеют такие структуры, как приведенная выше классовая структура;Вы получаете безопасность типов, но не можете, например, дать разумные имена этим пяти свойствам.Кортежи в VB.NET представляют собой не что иное, как безопасный для типов набор анонимных значений.

...