Question

J'ai les variables suivantes:

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

Maintenant, je dois trouver le type de données de chaque chaîne, c’est-à-dire le type de données auquel elle peut être convertie si les guillemets sont supprimés. Voici ce que je voudrais que chaque variable convertisse en:

  

str1 - entier
  str2 - chaîne
  str3 - double
  str4 - caractère

Remarque: si la chaîne comporte un seul caractère, il doit s'agir d'un caractère, bien qu'une chaîne puisse comporter une seule lettre, je la limite.

FYI: ces valeurs sont obtenues à partir de DataGrid où i sont entrées manuellement. Donc, tout devient une ficelle. Y a-t-il un moyen de le faire?

Était-ce utile?

La solution

Utiliser les métadonnées , si vous le pouvez

Il est déconseillé de deviner quels sont les types de données.

Deux choses

1 D'où proviennent les données?

S'il s'agit d'une base de données, êtes-vous sûr que ce sont des chaînes? S'il s'agit d'une base de données, des métadonnées doivent être renvoyées pour vous indiquer les types de données des champs.

S'il s'agit d'un fichier XML, existe-t-il un schéma qui vous donnera les types?

2 Si vous devez continuer à deviner.

Sachez que vous pouvez avoir des chaînes qui sont des nombres, mais qui sont parfaitement valides, par exemple des numéros de téléphone, des numéros de compte bancaire, qui sont mieux exprimées sous forme de chaînes. De plus, ces nombres peuvent avoir plusieurs chiffres. Si vous les convertissez en doublons, vous risquez de perdre des chiffres en inexactitudes en virgule flottante (vous devriez être OK jusqu'à 14 ou 15 chiffres)

Je suis sûr maintenant - parce que j'ai pris mon temps à taper ceci - il y a beaucoup de réponses qui vous disent comment faire cela (c'est-à-dire tryparse int en premier, puis double, puis teste la longueur pour char, sinon une chaîne, etc.), mais si j'étais vous, j'essaierais de NE PAS faire cela et de voir si vous pouviez obtenir ou transmettre des méta-données qui vous indiqueront le type de ce IS et pas seulement de quel type il pourrait être

Autres conseils

Bien sûr, il n’existe aucun moyen précis de le faire, mais si vous créez une liste de types de données que vous souhaitez vérifier ordonnées par priorité, une solution de ce type peut faire l'affaire.

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;
}

Appelez simplement cette fonction sur chaque chaîne et vous devriez obtenir le type d'objet approprié renvoyé. Une vérification de type simple peut ensuite vous indiquer comment la chaîne a été analysée.

Utilisez la méthode TryParse de chaque type.

Il n’existe pas de méthode intégrée pour ce faire. Vous pouvez essayer TryParse sur des types de nombres avec une précision croissante, mais cela ne garantit pas que tout se passe bien.

Votre meilleur pari est de le traiter comme vous le feriez manuellement. i.e. Y a-t-il une décimale? Non - alors c'est un entier. De quelle taille? Est-ce négatif?

Le type de données pour chacun de ces éléments est une chaîne. Si vous souhaitez essayer de les analyser selon différents types, vous pouvez utiliser Int32.TryParse, Double.TryParse, etc. Vous pouvez également utiliser 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);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top