Domanda

Ho le seguenti variabili:

string str1 = "1";
string str2 = "asd";
string str3 = "3.5";
string str4 = "a";

Ora devo trovare il tipo di dati di ogni stringa, ovvero il tipo di dati in cui può essere convertito se le virgolette vengono rimosse. Ecco cosa vorrei convertire in ogni variabile:

  

str1 - numero intero
  str2 - stringa
  str3 - doppio
  str4 - char

Nota: se la stringa ha un carattere singolo, dovrebbe essere char, sebbene una stringa possa contenere una sola lettera, la sto limitando.

Cordiali saluti: questi valori sono ottenuti da DataGrid dove ho inserito manualmente i valori. Quindi tutto sta diventando una stringa. C'è un modo per farlo?

È stato utile?

Soluzione

Utilizza i metadati , se puoi

Che tu debba indovinare quali sono i tipi di dati, non è una buona idea.

Due cose

1 Da dove provengono i dati?

Se si tratta di un database, sei sicuro che siano stringhe? Se si tratta di un database, dovrebbero essere restituiti alcuni metadati che indicheranno quali sono i tipi di dati dei campi.

Se si tratta di un file Xml, esiste uno schema definito che ti darà i tipi?

2 Se devi continuare a indovinare.

Tieni presente che puoi avere stringhe che si presentano come numeri, ma sono stringhe perfettamente valide, ad esempio numeri di telefono, numeri di conto bancario, che sono meglio espressi come stringhe. Inoltre, questi numeri possono avere molte cifre, se le converti in doppie potresti perdere alcune cifre in imprecisioni in virgola mobile (dovresti essere OK fino a 14 o 15 cifre)

Ormai sono sicuro - perché mi sono preso il tempo di scrivere questo - ci sono molte risposte che ti dicono come fare (cioè prima intyparse, poi raddoppia, quindi prova la lunghezza per il carattere, se no allora è una stringa ecc.), ma se fossi in te, proverei a NON farlo, e vedo se c'è un modo per ottenere o passare alcuni metadati che ti diranno che tipo È e non solo di che tipo potrebbe essere

Altri suggerimenti

Ovviamente, non esiste un modo definito per farlo, ma se crei un elenco di tipi di dati che desideri controllare ordinati per priorità, qualcosa del genere potrebbe fare il trucco.

object ParseString(string str)
{
    int intValue;
    double doubleValue;
    char charValue;
    bool boolValue;

    // Place checks higher if if-else statement to give higher priority to type.
    if (int.TryParse(str, out intValue))
        return intValue;
    else if (double.TryParse(str, out doubleValue))
        return doubleValue;
    else if (char.TryParse(str, out charValue))
        return charValue;
    else if (bool.TryParse(str, out boolValue))
        return boolValue;

    return null;
}

Basta chiamare questa funzione su ogni stringa e si dovrebbe restituire il tipo appropriato di oggetto. Un semplice controllo del tipo può quindi dirti come è stata analizzata la stringa.

Utilizza il metodo TryParse di ciascun tipo.

Non esiste un modo integrato per farlo, potresti provare TryParse su tipi di numero con una precisione crescente, ma non garantirebbe che sia giusto.

La tua scommessa migliore su come elaborarla come faresti manualmente. cioè c'è un decimale? No - quindi è un numero intero. Quanto grande? È negativo?

Il tipo di dati per ciascuno di questi elementi è stringa. Se si desidera tentare di analizzarli in diversi tipi, è possibile utilizzare Int32.TryParse, Double. TryParse, ecc. Oppure è possibile utilizzare Regex:

bool isInt = new Regex(@"^\d+<*>quot;).IsMatch(str);
bool isDouble = !(isInt) && new Regex(@"^\d+\.\d+<*>quot;).IsMatch(str);
bool isChar = !(isInt || isDouble) && new Regex(@"^.<*>quot;).IsMatch(str);
bool isString = !(isInt || isDouble || isChar);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top