2011-02-22 18 views
13

我使用Microsoft.Office.Interop.Excel我得到了一個類型爲object[,]的二維數組,其中包含double元素。請注意,指數下限爲1,而不是默認的0,但我可以輕鬆處理。如何快速將對象[,]轉換爲double [,]?

如何可以使用.NET 3.5將數組轉換爲double[,]。 (很好,我的意思是簡潔或緊湊)。

注意

double[] values_2 = values.Cast<double>().ToArray(); 

的工作,但它由展平陣列成一維結構。

+0

有沒有「快速」的方式來做到這一點。如果這是你想要的,你必須將所有的數據複製到一個新的數組中。 – Gabe 2011-02-22 20:30:17

+0

我很害怕這個。那麼.NET 4.0呢?會不會有一種安全的Office Interop類型? – ja72 2011-02-22 20:31:45

+1

快速地在「no cpu」中或像在「單行語句」中那樣快速 – rene 2011-02-22 20:32:48

回答

27
object[,] src = new object[2, 3]; 

// Initialize src with test doubles. 
src[0, 0] = 1.0; 
src[0, 1] = 2.0; 
src[0, 2] = 3.0; 
src[1, 0] = 4.0; 
src[1, 1] = 5.0; 
src[1, 2] = 6.0; 

double[,] dst = new double[src.GetLength(0), src.GetLength(1)]; 
Array.Copy(src, dst, src.Length); 
+0

你真的嘗試過嗎? – Gabe 2011-02-22 20:45:01

+0

@加貝是的,我有。 – Marlon 2011-02-22 20:46:37

+5

工作的廢話!謝謝。再次受到SO的教育。謝謝! – ja72 2011-02-22 20:50:15

3

我不會說有一種方法比另一種更快,只要你不做任何愚蠢的事情。如果可以的話,我會這樣說,當你訪問它們而不是在前面時施放它們。當然,這取決於你打算如何訪問它們。如果您要不止一次索引到陣列中,拆箱的成本可能會開始變得太大。如果你只掃描一次陣列,然後繼續投射。

1

這裏有幾個問題。

首先,因爲double不是引用類型,所以它必須被裝箱以存儲在一個對象[]中,因此獲取值的唯一方法是將這些值解包爲double [](副本)。

另一個問題是,在C#,數組是協變而不是逆變,可以分配一個數組來爲更多的衍生型的引用,而不是不爲衍生較少類型中的一個。

string[] strings = new string[10]; 
object[] objects = strings; // OK, covariant 
string[] strings2 = objects; // not OK, contravariant 
objects[0] = 10; // Compiles fine, runtime ArrayTypeMismatchException! 
1
Array.Copy(src, dst, src.Length); 

該代碼會得到錯誤,如果任何價值的SRC爲空。由於在上面的代碼src有一些定義的值它工作正常。如果值爲src是動態設置的,不幸的是,如果任何值爲null,則上述代碼將不起作用。值不會被成功複製。

2

這應該在大多數情況下工作,但如果您不分配轉換委託可能會引發異常。

public static TResult[,] Convert<TSource, TResult>(
    this TSource[,] array, Func<TSource, TResult> conversion = null) { 

     if(array == null) throw new ArgumentNullException("array"); 

     if (conversion == null) { 
      var resultType = typeof(TResult); 
      conversion = source => (TResult)System.Convert.ChangeType(source, resultType); 
     } 

     var width = array.GetLength(1); 
     var height = array.GetLength(0); 
     var result = new TResult[height, width]; 

     for (int i = 0; i < height; ++i) 
      for (int j = 0; j < width; ++j) 
       result[i, j] = conversion(array[i, j]); 

     return result; 
    } 
+0

謝謝但做元素轉換不是很有效,絕對不是_nice_解決方案。儘管如此,後代還是有好處。 – ja72 2016-03-18 19:13:25

+0

我同意,它有點難看,但應該在更廣泛的環境中使用,而不僅僅是處理Excel的對象數組。默認行爲肯定很慢,但傳入適當的委託可以加速很多事情。 – JamesFaix 2016-03-18 19:27:01

+0

接受的解決方案很好地完成了這項工作,沒有一隻手握住。 – ja72 2016-03-18 19:39:06

相關問題