2010-09-07 111 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"} }