2013-11-21 42 views
1

我有一個將2維數組作爲參數的方法。將數組複製到長度爲1的二維數組作爲第二維

void Process(object[,] array) 
{ 
    // do something 
} 

這種方法也可用於2維陣列,其僅具有一個「行」,例如,用於像變量:

object[,] flatArray = new object[N,1]; 

我有我想作爲治療1維數組2維數組。我能想出的最佳解決方案是:

private object[,] Make2D(object[] array) 
{ 
    object[,] result = new object[array.Length, 1]; 
    for(int i = 0; i < array.Length; i++) 
    { 
     result[i, 0] = items[i]; 
    } 
    return result; 
} 

有沒有更高效/更聰明的方法來做到這一點?

+0

您可以更改枚舉而不是創建新數組。有點像這樣:http://stackoverflow.com/questions/10554866/how-do-you-transpose-dimensions-in-a-2d-collection-using-linq – Kaido

回答

1

我沒有看到你的代碼的任何問題。

我不喜歡C#中的多維數組,它們很難合作,在框架中缺少工具來處理它們......例如:不能將Array.Resize用於多維數組。

我更喜歡計算單維數組的索引,並且模擬多維數組而不是使用多維數組。這樣你可以自由地處理數組,而不需要數組轉換。

1

我會建議你使用泛型爲了避免後面的鑄造:

private T[,] Make2D<T>(T[] array) 
{ 
    T[,] result = new T[array.Length, 1]; 
    for (int i = 0; i < array.Length; i++) 
    { 
     result[i, 0] = array[i]; 
    } 
    return result; 
} 

這裏是你如何使用它:

int[] example = new int[15]; 
//insert data to example 
Make2D<int>(example); 
+0

感謝您的提示,但我使用數組混合類型,所以對象對我來說很好。但是,這可能有助於其他人。 – helb

0
public static class Program 
{ 
    static void Main(string[] args) 
    { 

     var test = new[] {1, 2, 3}.To2D(); 
    } 

    public static T[,] To2D<T>(this T[] array) 
    { 
     if (array == null) throw new ArgumentNullException("array"); 

     var i = 0; 
     var res = new T[array.Length, 1]; 

     Array.ForEach(array, o => res[i++, 0] = o); 

     return res; 
    } 
}