Pareciera por algunos detalles que estás más habituado a usar VB. 6.0 que .Net. Tal vez me equivoque.
La solución la puedes implementar de muchas formas, a través de diferentes objetos que sean capaces de construir colecciones, aunque no uses específicamente un objeto Collection.
Yo suelo usar
ArrayList o
HashTables, que crecen dinámicamente según lo que se le agregue, e incluso pueden contener objetos distintos en cada entrada.
También suelo usar arrays de objetos cuando la clase la creo yo mismo, como es tu caso.
En este caso podría ser:
Código vb.net:
Ver originalDim contactos as New ArrayList
Dim persona as Contacto
For Each r As DataRow In TablaDevuelta.Rows
persona = New Contacto
persona.setnombre = Convert.ToString(r.Item("nombre"))
persona.setapellido = Convert.ToString(r.Item("apellido1"))
contactos.Add(persona)
Next
Al terminar de ejecutarse, la variable r, que se creó en el momento de iniciar el For Each..., desaparece, y el ArrayList contactos contiene una colección de objetos Contacto con sus nombres y apellidos cargados.
El uso de
System.Convert.ToString() es obligatorio en VB.Net 2005 de acuerdo a las configuraciones del proyecto,
por lo que hemos encontrado recientemente en algunas migraciones desde VB.Net 2003, por eso lo incluyo. Aún no estoy totalmente seguro de si es necesario, aunque sí lo es en el caso de valores sin signo, por ejemplo.
En un ArrayList, los objetos son accedidos por medio del método Item(subindice), por ejemplo, usándolo para cargar un textBox:
Código vb.net:
Ver originalTextBox1.Text = contactos.Item(2).DarNombre
(suponiendo que DarPersona sea un método o propiedad que devuelva el nombre)