8
votes

Comment stocker des données de matrice mixtes?

Disons que j'ai un tableau, j'ai besoin de stocker des valeurs de chaîne ainsi que des valeurs doubles. Je sais que je peux stocker les doubles comme des chaînes et je ne fais que gérer les conversions, mais est-il possible d'utiliser un tableau avec deux types de données?


2 commentaires

Combien de performances est importante? Si c'est le cas, j'aurais pu essayer d'écrire une classe personnalisée les stocker séparément, mais les expose comme une.


Comment détectez-vous s'il s'agit d'un double ou d'une chaîne que vous retirez. Sont-ils toujours dans le même ordre ou?


4 Réponses :


4
votes

Utilisation sûre:

object[], ArrayList, or List<Object>;


5 commentaires

Que recommanderiez-vous pour une efficacité maximale? Je traite avec des tableaux de taille d'éléments 50K.


@SOO - Est-ce toujours des éléments de 50 000 et est-ce que chacun des éléments de 50 km est toujours rempli?


Je penserais que si vous avez besoin de redimensionner la matrice, que le tableau ou la liste serait mieux. S'il n'y a pas de redimensionnement nécessaire, utilisez simplement un objet [], comme cela sera meilleur pour la recherche rapide que la liste ou arraychiste.


50k ... Les trois à peu près la même chose, en termes de stockage, mais honnêtement, je reviendrais probablement en utilisant un tableau du tout et essayez d'utiliser plusieurs structures plus petites.


La matrice est généralement la plus rapide, car elle n'a pas la longueur variable de l'arraylist et de la liste.



1
votes

objet [] et arraylist sont deux options décentes; Cela dépend de la question de savoir si vous avez besoin d'une matrice de longueur fixe traditionnelle ou d'un vecteur (réseau de longueur variable). En outre, je voudrais «envelopperiez» l'un d'entre eux dans une classe personnalisée qui a fait une vérification de type, si les chaînes et les doubles sont les seules choses que vous pouvez gérer et vous devez pouvoir les récupérer en tant que cordes et doubles.


0 commentaires

8
votes

Vous pouvez utiliser objet [] code> et faire une vérification de type. Vous obtiendrez une boîte de boxe / une boîte de consigne lors de l'accès aux doubles, mais cela sera plus rapide que double.parse () code> de toute façon.

Une alternative consiste à créer une classe avec des types et un marqueur:

class StringOrDouble
{
    private double d;
    private string s;
    private bool isString;

    StringOrDouble(double d)
    {
        this.d = d;
        isString = false;
    }

    StringOrDouble(string s)
    {
        this.s = s;
        isString = true;
    }

    double D
    {
        get
        {
            if (isString)
                throw new InvalidOperationException("this is a string");
            return d;
        }
    }

    string S
    {
        get
        {
            if (!isString)
                throw new InvalidOperationException("this is a double");
            return s;
        }
    }
    bool IsString { get { return isString; } }
}


1 commentaires

^ Est-ce ce que vous décrivez ici une structure?



2
votes

Pas l'utilisation la plus efficace, mais que diriez-vous de flexibilité: xxx

ou même xxx


0 commentaires