View Full Version : [C#] Conversione
Fonzy9114
05-03-2011, 19:53
Salve io dovrei convertire la componente di un vettore da string a tipo variabile (cioè che cambia).
Vi incollo qui sotto il codice fatemi sapere gentilmente se è possibile risolvere la cosa :D grazie in anticipo per le risposte.
static void Main()
{
int dimensione;
string[] vettoreS = null;
int[] vettoreI = null;
double[] vettoreD = null;
acqVettore(out dimensione, vettoreS);
acqVettore(out dimensione, vettoreI);
acqVettore(out dimensione, vettoreD);
Console.ReadLine();
}
static void acqVettore<T>(out int dim, T[] vettoreT)
{
Console.Write("Inserisici dimensione: ");
dim = Convert.ToInt32(Console.ReadLine());
vettoreT = new T [dim];
for (int i = 0; i < dim; i = i + 1)
{
Console.Write("Inserire valore elemento {0}: ", i);
Type tipo = vettoreT.GetType();
vettoreT[i] = Convert.ChangeType <--- stavo provando questo metodo ma non so esattamente come usarlo...
}
}
kelendil
05-03-2011, 20:19
Una possibile soluzione è:
static void Main()
{
int dimensione;
string[] vettoreS = null;
int[] vettoreI = null;
double[] vettoreD = null;
acqVettore(out dimensione, vettoreS);
acqVettore(out dimensione, vettoreI);
acqVettore(out dimensione, vettoreD);
Console.Read();
}
static void acqVettore<T>(out int dim, T[] vettoreT)
{
Console.Write("Inserisici dimensione: ");
dim = Convert.ToInt32(Console.ReadLine());
vettoreT = new T[dim];
for (int i = 0; i < dim; i = i + 1)
{
Console.Write("Inserire valore elemento {0}: ", i);
var s = Console.ReadLine();
try
{
vettoreT[i] = (T)Convert.ChangeType(s, typeof(T));
}
catch (Exception e)
{ /* Eccezzione da gestire se il tipo T non è IConvertible */ }
}
}
Spero fosse quello che cercavi ;)
Fonzy9114
05-03-2011, 23:22
Ciao, intanto ti ringrazio per la risposta. Ho accorciato in questo modo, secondo te ci sarebbe un altro metodo da usare? Essendo solo al terzo anno di info non ho molte conoscenze. Sapresti spiegarmi queste 2 righe:
var s = Console.ReadLine();
vettoreT[i] = (T)Convert.ChangeType(s, typeof(T));<-- per questa solo la parta nelle parentesi e la (T) prima del metodo. Avevo provato con ChagenType ma non ne venivo fuori XD Grazie per l'aiuto.
static void acqVettore<T>(out int dim, T[] vettoreT)
{
Console.Write("Inserisici dimensione: ");
dim = Convert.ToInt32(Console.ReadLine());
vettoreT = new T [dim];
for (int i = 0; i < dim; i = i + 1)
{
Console.Write("Inserire valore elemento {0}: ", i);
var s = Console.ReadLine();
vettoreT[i] = (T)Convert.ChangeType(s, typeof(T));
}
}
kelendil
06-03-2011, 14:07
Ciao, intanto ti ringrazio per la risposta. Ho accorciato in questo modo, secondo te ci sarebbe un altro metodo da usare? Essendo solo al terzo anno di info non ho molte conoscenze. Sapresti spiegarmi queste 2 righe:
var s = Console.ReadLine();
vettoreT = (T)Convert.ChangeType(s, typeof(T));<-- per questa solo la parta nelle parentesi e la (T) prima del metodo. Avevo provato con ChagenType ma non ne venivo fuori XD Grazie per l'aiuto.
Ma certo.
La prima riga ( var s = Console.Readline(); ) vede la dichiarazione di una variabile locale generica il cui tipo viene inferenziato dal compilatore autonomamente. In pratica lui capisce (da quello che gli assegni) che si tratta di una stringa perché Console.Readline() restituisce una stringa. E' possibile comunque sostituire quella riga di codice con una che da lo stesso identico risultato e che probabilmente ti risulterà più familiare:
[I]string s = Console.Readline();
Passiamo alla seconda.
vettoreT[i] = (T)Convert.ChangeType(s, typeof(T));
Questa riga va ad assegnare alla cella i del vettore vettoreT il risultato della Convert.ChangeType. (T) posto davanti all'invocazione del metodo indica un cast esplicito, ossia si informa il compilatore che la variabile che compare dopo deve cambiare tipo, essere convertita verso il tipo di destinazione. Il Convert.ChangeType non fa altro che eseguire questa conversione. Il metodo prende un Object (che è la superclasse di qualsiasi variabile e quindi puoi dargli come primo argomento qualsiasi cosa) e il tipo verso il quale si vuole effettuare la conversione. Quest'ultimo parametro lo si ottiene utilizzando il metodo typeof(<Tipo>). Se al posto di T come argomento del typeof avessi messo int, il ChangeType avrebbe cercato di convertire la stringa s in intero.
Fonzy9114
06-03-2011, 18:08
ok ti ringrazio ancora... Spiegazione molto chiara. Grazie
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.