2010-09-07 80 views
2

比方说,我有一个数组,我需要存储字符串值以及双值。我知道我可以将双打存储为字符串,只处理转换,但是可以使用两种数据类型的数组吗?如何存储混合阵列数据?

+0

多少性能是非常重要的?如果是这样,我可以尝试编写一个自定义类来单独存储它们,但将它们暴露为一个。 – Aliostad 2010-09-07 19:41:12

+0

你如何检测你是否拉出双线或字符串。他们总是以相同的顺序还是? – 2010-09-07 19:46:47

回答

4

您可以使用object[]并进行一些类型检查。无论如何,访问双打时你会得到一些装箱/取消装箱,但是这将比double.Parse()更快。

另一种方法是创建具有这两种类型和标记物的类:

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

,然后创建StringOrDouble的阵列。这会让你免于一些类型检查和装箱,但会有更大的内存开销。

+0

^是你在这里描述的结构? – sooprise 2010-09-07 19:33:57

3

确保使用:

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

你必须要投,而且可能付出装箱损失双打,但他们会允许你存储两种不同类型。

+0

您会推荐哪种方式以获得最大效率?我正在处理5万个元素大小的数组。 – sooprise 2010-09-07 19:28:54

+0

@Soo - 它是否总是50k个元素,并且每个50k元素总是被填充? – 2010-09-07 19:29:42

+0

总是50k,总是填充 – sooprise 2010-09-07 19:30:38

0

object[]ArrayList是两个不错的选择;这取决于您是需要传统的固定长度数组还是矢量(可变长度数组)。此外,如果字符串和双打是你可以处理的唯一事情,并且你需要能够将它们作为字符串加倍并且加倍,那么我会将它们中的一个“包装”到一个自定义类中,它执行了一些类型检查。

0

不是最有效的使用,但如何灵活:

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

甚至

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