5

Necesito obtener información desde una base de datos y luego guardarlos con una estructura definida en un array.

La estructura que uso se llama taskObject y tengo elementos llamados idTask, nameTask y descriptionTask.

 public class taskObject
{
    public int idTask { get; set; }
    public string nameTask { get; set; }
    public string descriptionTask { get; set; }
}

Ahora necesito guardarlos en un array, así que definí el array con la clase antes creada

taskObject[] listTask;

luego instancio el valor de los datos traidos desde la base de datos

//Se instancia objeto taskObject el cualtiene la estructura basica de las tareas
taskObject Objtask = new taskObject();

//Se pasa a el objeto el valor idTask, el cual guarda el id de la tarea
Objtask.idTask = Convert.ToInt32(responseDB["idTask"]);

//Se pasa a el objeto el valor nameTask, el cual guarda el nombre de la tarea
Objtask.nameTask = responseDB["Task"].ToString();

//Se pasa a el objeto el valor descriptionTask, el cual guarda la descricion de la tarea
Objtask.descriptionTask = responseDB["Description"].ToString();

¿Como agrego los objetos que he creado al array que ya he definido?

Kenny Barrera
  • 2,075
  • 3
  • 22
  • 38
Alejo Florez
  • 828
  • 8
  • 24
  • 2
    La pregunta me parece muy buena y la he mejorado un poquito para todos los que vengan al sitio encuentren su respuesta tan ansiada. (Que curioso que nadie haya preguntado esto antes en SOes, buena pregunta de nuevo) – Kenny Barrera Aug 28 '17 at 20:56

2 Answers2

4

Primero que nada, has de tener en cuenta que en este punto de tu código, solamente has declarado el arreglo que vas a usar, pero no esta instanciado, es decir, no tiene nada "dentro". Para instanciar tu arreglo, tienes que hacer algo asi:

listTask = new taskObject[10];  // listTask es un array de 10 taskObjects
listTask = new taskObject[20];  // listTask es un array de 20 taskObjects

Asi, tu arreglo quedaria de "largo" 10, 20, 30, etc. El problema es que no puedes añadir mas elementos de las posiciones ya creadas con el arreglo, a menos que lo redimensiones. Para redimensionar un arreglo tendrias que hacer algo asi:

Array.resize(ref listTask, 30);

Y despues de esto, acceder a un indice del array y guardar alli la información que necesitas.

listTask[15] = new taskObject();

El gran problema con esto es que Array.resize crea un nuevo arreglo cada vez que es llamada, lo cual, es una locura a nivel de rendimiento. Claro que con 5 o 10 tareas no es nada, pero imaginate si tienes 10, 20 o 30 mil tareas que recuperar de la base de datos.

Solución Alternativa

A mi parecer, la forma más conveniente de resolver esto es usar una lista. Básicamente es lo mismo, solo que si se puede añadir elementos dinamicamente sin tener que redimensionar el tamaño. En C# existe una implementacion ya de esto con la clase List.

Para declarar una List de taskObject tendrias que hacer algo asi:

List<taskObject> listTask = new List<taskObject>();

Como puedes notar, ya esta instanciada la lista, y no tuvimos que definir el tamaño. Esto significa que puedes añadir mas objetos cada vez que necesites. Puedes añadirlos de esta manera:

listTask.Add(new taskObject());

Anotaciones post solucion:

  • Hay una pregunta identica en el sitio en ingles, por si quieres consultarla y aprender mas.
  • Te invito a crear tu propia implementacion de listas doblemente enlazadas para que entiendas mejor como funciona List. Es un buen ejercicio.
  • Tambien es bueno no confiar tanto en los IDE, a veces restringen nuestra manera de pensar y encontrar soluciones.
Kenny Barrera
  • 2,075
  • 3
  • 22
  • 38
3

Para almacenar de forma dinámica podrías usar:

List<TaskObject> tasks = new List<TaskObject>();

tasks.Add(new TaskObject { 
    IdTask = Convert.ToInt32(responseDB["idTask"]),
    NameTask = responseDB["Task"].ToString(),
    DescriptionTask = responseDB["Description"].ToString()
});

TaskObject[] listTask = tasks.ToArray();

DEMO


Referencia:

  • Clase List: Representa una lista de objetos fuertemente tipados a la que se puede obtener acceso por índice. Proporciona métodos para buscar, ordenar y manipular listas.
Davlio
  • 2,900
  • 1
  • 13
  • 22
  • 1
    Muchas gracias, esta fue la forma con la que pude procesar los datos, gracias nuevamente – Alejo Florez Aug 28 '17 at 20:51
  • 1
    Estaba busncando algo similar... Pero no entiendo la ultima parte sobre TaskObject[] listTask = tasks.ToArray(); por que lo vuelves a convertir en un array sin tamaño? –  Aug 28 '17 at 20:53
  • 1
    @Angus debido a que el OP requiere que el resultado lo guarde en un array, y para ello uso el método [ToArray](https://msdn.microsoft.com/es-es/library/x303t819(v=vs.110).aspx). – Davlio Aug 28 '17 at 20:55
  • 1
    @Angus, te equivocas a decir que lo convierto a un array sin tamaño, puedes revisar la [**DEMO**](https://dotnetfiddle.net/QAF1xN) – Davlio Aug 28 '17 at 21:11