2010-09-07 2 views
2

Disons que j'ai un tableau dont j'ai besoin pour stocker des valeurs de chaîne ainsi que des valeurs doubles. Je sais que je peux stocker les doubles en tant que chaînes, et juste traiter les conversions, mais est-il possible d'utiliser un tableau avec deux types de données?Comment stocker des données de tableau mixte?

+0

Combien la performance est importante? Si c'est le cas, j'aurais pu essayer d'écrire une classe personnalisée en les stockant séparément mais en les exposant comme une seule. – Aliostad

+0

comment pouvez-vous détecter si c'est un double ou une chaîne que vous retirez. Sont-ils toujours dans le même ordre ou? –

Répondre

4

Vous pouvez utiliser object[] et effectuer une vérification de type. Vous obtiendrez un peu de boxe/unboxing lors de l'accès aux doubles, mais ce sera plus rapide que double.Parse() de toute façon.

Une alternative est de créer une classe avec les deux 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; } } 
} 

puis créer un tableau de StringOrDouble. Cela vous évitera de faire du typage et de la boxe, mais aura une mémoire plus importante.

+0

^est ce que vous décrivez ici une structure? – sooprise

3

utilisation sûre:

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

Vous aurez à jeter, et probablement payer une pénalité de boxe pour les doubles, mais ils vous permettront de stocker deux types différents.

+0

Que recommanderiez-vous pour une efficacité maximale? J'ai affaire à des arays de 50k éléments. – sooprise

+0

@Soo - Est-ce toujours 50k éléments et chacun des 50k éléments est-il toujours rempli? –

+0

toujours 50k, toujours rempli – sooprise

0

object[] et ArrayList sont deux options décentes; Cela dépend si vous avez besoin d'un tableau traditionnel de longueur fixe ou d'un vecteur (tableau de longueur variable). En outre, je voudrais "envelopper" l'un d'eux dans une classe personnalisée qui a fait une vérification de type, si les cordes et les doubles sont les seules choses que vous pouvez gérer, et vous devez être en mesure de les sortir en tant que cordes et doubles.

0

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

var a = new object[] {1,2,3,"paul",5.5} 

ou même

var a = new object[] {1,2,3,"paul",5.5, new List<string>() {"apple","banana","pear"} } 
Questions connexes