It would be:
Dim name1 As String = people(0)(0)
However, this structure is very confusing. You have to remember what type of thing is at each index in each array, and there's no way to reliably relate a name to a description.
It would be better to build a Person class with Name and Description properties, then, build a list of new Person objects, even if some of their properties are Nothing (null). Using jagged arrays isn't very maintainable and even your simple example above is hard to swallow.
Here's how I would approach this (with some comments thrown in for explanation). It's more code than your example, but it will be far more maintainable
Public Class Person
' Private backing fields
Private _name As String
Private _description As String
' Default constructor
Public Sub New()
End Sub
' Overloaded constructor that takes a name and optionally a description
Public Sub New(ByVal name As String, _
Optional ByVal description As String = Nothing)
Me.Name = name
Me.Description = description
End Sub
' A property (getter & setter) for Name
Public Property Name As String
Get
Return _name
End Get
Set(ByVal value As String)
_name = value
End Set
End Property
' A property (getter & setter) for Description
Public Property Description As String
Get
Return _description
End Get
Set(ByVal value As String)
_description = value
End Set
End Property
End Class
And create a new list of them:
Dim people As New List(Of Person)
people.Add(new Person("Name1", "Description1"))
people.Add(new Person("Name2")) ' Description is optional
people.Add(new Person("Name3", "Description2"))
Then you can use the various methods provided by the List(Of T) class to find a manipulate items in the list without ever needing to know an index.
Edit: If you want multiple descriptions for a person, your code might look like:
Public Class Person
' Private backing fields
Private _name As String
Private ReadOnly _descriptions As List(Of String) = New List(Of String)
' Default constructor
Public Sub New()
End Sub
' Overloaded constructor that takes a name and optionally a description
Public Sub New(ByVal name As String, _
Optional ByVal descriptions As IEnumerable(Of String) = Nothing)
Me.Name = name
If Not descriptions Is Nothing Then
Me.Descriptions.AddRange(descriptions)
End If
End Sub
' A property (getter & setter) for Name
Public Property Name As String
Get
Return _name
End Get
Set(ByVal value As String)
_name = value
End Set
End Property
' A property (getter) for Descriptions
Public ReadOnly Property Descriptions As List(Of String)
Get
Return _descriptions
End Get
End Property
End Class
And create a new list of them:
Dim people As New List(Of Person)
' Because the constructor takes any `IEnumerable`, you have options
' as to how you add descriptions
people.Add(new Person("Name1", New String() { "Desc1", "Desc2" }))
' or
Dim person1 As New Person("Name1")
person1.Descriptions.Add("Desc1")
person1.Descriptions.Add("Desc2")
people.Add(person1)
There are several other ways to do it but these two are simple.