﻿'VB.Net 2008
'Console Application

Public Structure Row
    Public Field1 As Integer
    Public Field2 As Integer
    Public Field3 As Integer
End Structure



Public Class List

    Private m_Buffer() As Row
    Private m_Count As Integer
    '________________________________________________________________________

    Public Sub New()
        Me.m_Buffer = New Row(0) {}
        Me.m_Count = 0
    End Sub
    '________________________________________________________________________

    Public Sub Insert(ByVal value As Row, ByVal index As Integer)
        '----- Clamp ...
        If (index < 0) Then
            index = 0
        ElseIf (index > Me.m_Count) Then
            index = Me.m_Count
        End If
        '----- Expand ...
        If (Me.m_Count >= Me.m_Buffer.Length) Then
            Dim capacity As Integer = Me.m_Buffer.Length
            Dim newbuffer() As Row = New Row(capacity + capacity - 1) {}

            Do While (capacity > 0)
                capacity -= 1
                newbuffer(capacity) = Me.m_Buffer(capacity)
            Loop

            'System.GC.SuppressFinalize(Me.m_Buffer);
            Me.m_Buffer = newbuffer
        End If
        '----- Shift ...
        For i As Integer = Me.m_Count To index + 1 Step -1
            Me.m_Buffer(i) = Me.m_Buffer(i - 1)
        Next
        '----- Set ...
        Me.m_Buffer(index) = value
        Me.m_Count += 1
    End Sub
    '________________________________________________________________________

    Public Sub Add(ByVal value As Row)
        Me.Insert(value, &H7FFFFFFF)
    End Sub
    '________________________________________________________________________

    Public Sub RemoveAt(ByVal index As Integer)
        If (Me.m_Count <= 0) Then Return
        '----- Clamp ...
        If (index < 0) Then
            index = 0
        ElseIf (index >= Me.m_Count) Then
            index = Me.m_Count - 1
        End If
        '----- Shift ...
        index += 1
        Do While (index < Me.m_Count)
            Me.m_Buffer(index - 1) = Me.m_Buffer(index)
            index += 1
        Loop
        '----- Set ...
        Me.m_Count -= 1
    End Sub
    '________________________________________________________________________

    Public ReadOnly Property Count() As Integer
        Get
            Return Me.m_Count
        End Get
    End Property
    '________________________________________________________________________

    Default Public Property Item(ByVal index As Integer) As Row
        Get
            If (Me.m_Count <= 0) Then Return New Row()
            If (index < 0) Then
                index = 0
            ElseIf (index >= Me.m_Count) Then
                index = Me.m_Count - 1
            End If

            Return Me.m_Buffer(index)

        End Get
        Set(ByVal value As Row)
            If (Me.m_Count <= 0) Then Return
            If (index < 0) Then
                index = 0
            ElseIf (index >= Me.m_Count) Then
                index = Me.m_Count - 1
            End If

            Me.m_Buffer(index) = value
        End Set
    End Property
    '________________________________________________________________________





    <STAThread()> Public Shared Sub Main()

        Dim v As New List()
        Dim r As Row

        r.Field1 = 14
        v.Add(r)

        r = v(0)
        r.Field2 = 114
        v(0) = r

        '...

        Dim iField As Integer = Console.Read()
        Console.WriteLine("End")

    End Sub
    '________________________________________________________________________

End Class