Array de structs duda con los nombres C#

Iniciado por RevolucionVegana, 2 Junio 2017, 21:19 PM

0 Miembros y 1 Visitante están viendo este tema.

RevolucionVegana

Hola a todos tengo un programa que permite al usuario introducir datos y estos deben ser almacenados en structs, vale hasta aquí no hay problema si se la cantidad de structs que va a utilizar el usuario por ejemplo 3 structs los declaro y después solo tendría que ir asignando la cuestión está en que no sabré cuantos struct introducirá el usuario entonces mi duda viene en que como puedo crear los struct en tiempo de ejecución con el nombre que introduzca el usuario es decir, no se como puedo hacer para darle nombre a un struct o a una variable en tiempo de ejecución y que sea un nombre que por ejemplo haya sido recogido en una variable (por poner un ejemplo), no se si es con eso del preprocesador ese o creando una clase y crear instancias y jugar con eso, en fin cuál sería la forma correcta de hacer esto? Gracias y un saludo es en C#
HAS DICHO ALGO NENAAAAAA?!

Serapis

A ver... debe quedarte claro, que parte corresponde al programador y qué parte al usuario.
Es tarea del programador definir las estructuras de datos que debe tener el programa, y no el usuario. Al usuario debe importarle 4 ëggs, como llames tú a tus variables. Al usuario solo debe importarle que pueda almacenar, usar los datos, que funcione bien y punto.

Y en cuanto a tu duda, simplemente decirte que cuanto menos claro quede el tipo de datos que deba usar el usuario, más abstracta debe ser tu solución.

Hay excepciones obvias, como por ejemplo las bases de datos. Una tabla debe tener un nombre que el usuario (cliente), le indique u oriente que contiene esa tabla.
Ahora bien, en estos casos, el programador se pone codo con codo con el cliente, recogiendo las especificaciones que el cliente quiere que recoja el programa encargado y por tanto desde un inicio quedan claras las cosas.

En general para almacenar datos de cualquier tipo, suele ser útil una colección genérica tipo tabla-hash, junto a los datos a guardar se usa una clave (que si puede elegir el usuario) y que sirve para recoger después esos datos de nuevo.
Si el programa ha de utilizar varios y diferentes tipos de datos, lo adecuado es encapsular cada uno de ellos en una clase concreta que opere con dichos datos. es decir en vez de generar una estructura generas una clase. La clase ha de contener la funcionalidad adecuada para operar con dichos datos.

Por ejemplo: Si tenemos unos datos como: nombre, edad, calle, ciudad, nº identificación, etc... la clase que albergue dichos datos debería tener una propiedad para cada dato, alguno quizás sea de solo lectura, porque se genere internamente o porque puede que se establezca solo al crearse la clase... dicha funcionalidad debería también proveer la interfaz para rellenar un formulario con los datos y para presentarlos, también para buscar si debe haber más de una instancia de esa clase.
En cambio, si hay datos como Imagen, ruta, AnchoImagen, Altoimagen, parece obvio, que debe ser creada otra clase que albergue dichos datos, y la funcionalidad será del tipo, zoom, CargarImagen, SalvarImagen, y seguramente una ventana donde se vea la imagen y contenga Zoom, Brillo, Contraste, etc...
...pero para poder hacer todo esto, lógicamente debe ser desde un principio que quede especificado. No tiene sentido que crees un programa de control de stock de un almacén y que luego te digan que 'no tiene juego' para pasar el tiempo cuando no hay nada que hacer...

Eleкtro

#2
Cita de: RevolucionVegana en  2 Junio 2017, 21:19 PM
Hola a todos tengo un programa que permite al usuario introducir datos y estos deben ser almacenados en structs, vale hasta aquí no hay problema si se la cantidad de structs que va a utilizar el usuario por ejemplo 3 structs los declaro y después solo tendría que ir asignando la cuestión está en que no sabré cuantos struct introducirá el usuario entonces mi duda viene en que como puedo crear los struct en tiempo de ejecución con el nombre que introduzca el usuario es decir, no se como puedo hacer para darle nombre a un struct o a una variable en tiempo de ejecución y que sea un nombre que por ejemplo haya sido recogido en una variable (por poner un ejemplo), no se si es con eso del preprocesador ese o creando una clase y crear instancias y jugar con eso, en fin cuál sería la forma correcta de hacer esto? Gracias y un saludo es en C#

Estás contando la forma en la que has decidido resolver un problema, es decir estás explicando la solución que tienes pensada, pero no has mencionado cual es el problema que te ha llevado a enfocarte en esa solución...

A mi no me cuentes eso, da detalles claros y específicos. :P Cuéntanos el propósito que hay detrás de lo que estás intentando hacer, es decir, ¿con que intención quieres hacer eso, que es lo que quieres resolver haciendo eso y de esa manera en específico?, y no me digas que el motivo es "para poder introducir datos"  :P. Más que nada si insisto en que des esta información (por que nunca la das) es por que puede que explicándonos el problema podamos hallar una solución más...óptima a las circunstancias y a tus necesidades reales.

De todas formas, respondiendo a tus dudas y extendiendo la respuesta del compañero @NEBIRE:

Para declarar un array de estructuras de tamaño "indeterminado" cuyo tamaño lo determinas en tiempo de ejecución, pues tan solo tienes que declararlo e inicializarlo de la siguiente manera:
Código (csharp) [Seleccionar]
int structSize = 10;
ValueType[] structs = new ValueType[structSize];

...Donde el valor de la variable structSize lo proveería el usuario en tiempo de ejecución mediante tu interfáz gráfica o como sea, y ya te encargarías de controlarlo como sea que lo tengas pensado hacer.

Y con respecto a la asignación de nombres dinámicos a variables, eso no es algo posible en C#, sin embargo puedes utilizar cualquiera de los tipos de estructuras de datos en .NET que implementan los principios de un Array Asociativo, una estructura de datos de tipo key/value. por ejemplo una colección que implemente la interfáz IDictionary o ICollection<KeyValuePair<TKey, TValue>> para permitirte asignarle identificadores/keys cuyos nombres sean creados de forma dinámica en tiempo de ejecución. Por ejemplo puedes usar el tipo SortedDictionary<TKey, TValue>:

Código (csharp) [Seleccionar]
int structSize = 10;

int keyIndex = 1;
string keyName = string.Format("Key{0}", keyIndex); // "Key1"

Dictionary<string, ValueType[]> dict = new SortedDictionary<string, ValueType[]>(StringComparer.Ordinal);
dict.Add(keyName, new ValueType[structSize]);
// ...

ValueType[] structs = dict(keyName);

...Donde las variables structSize y keyIndex y/o keyName tendrian un valor dinámico cuando adaptases el código a tus necesidades.

Saludos!