2011-08-26 146 views
11

在C#,它可能初始化使用常數像這樣多維數組:初始化在c#多維陣列(與其他陣列)

Object[,] twodArray = new Object[,] { {"00", "01", "02"}, 
             {"10", "11", "12"}, 
             {"20", "21", "22"} }; 

我個人認爲初始化硬編碼的常數的陣列一種用於無用除了測試練習之外的任何事無論如何,我非常需要做的就是使用現有的數組來初始化一個新的多維數組。 (具有相同的項目數量,但內容當然只在運行時定義)。

我想要做的一個樣本是。

Object[] first = new Object[] {"00", "01", "02"}; 
Object[] second = new Object[] {"10", "11", "12"}; 
Object[] third = new Object[] {"20", "21", "22"}; 
Object[,] twodArray = new Object[,] { first, second, third }; 

不幸的是,這不會作爲有效的代碼進行編譯。有趣的是,當我試圖

Object[,] twodArray = new Object[,] { {first}, {second}, {third} }; 

代碼編譯和運行,但並沒有如期望的結果 - 一個3×3數組對象的,哪冒出來的是一個3×1陣列陣列,每個都有3個元素。當這種情況發生,我無法通過訪問我的數組:

Object val = twodArray[3,3]; 

我必須去:

Object val = twodArray[3,1][3]; 

這顯然是不理想的結果。

那麼,有沒有什麼辦法來從多個現有的數組初始化這個新的二維數組,而不訴諸迭代?

+0

是否對象[] {第一,第二,第三};有意義而不是Object [,] {first,second,third}; (去除尺寸昏迷)?應該注意爲twoarray [3] [3] –

回答

4

,如果你切換到交錯數組這會工作:

int[] arr1 = new[] { 1, 2, 3 }; 
int[] arr2 = new[] { 4, 5, 6 }; 
int[] arr3 = new[] { 7, 8, 9 }; 

int[][] jagged = new[] { arr1, arr2, arr3 }; 

int six = jagged[1][2]; 

編輯澄清上面的人對未來

的代碼示例中找到這個主題也不足,因爲它導致的數組(object [object]])而不是鋸齒陣列(object [] []),它們在概念上是相同的東西,但是不同的類型。

+0

我意識到一個數組的數組是可能的,但每行有相同數量的項目,所以二維數組實際上是我所追求的結構。一個多維數組創建一個很好的線性內存佈局,而一個鋸齒形數組意味着幾個額外的間接級別。 – Alain

+1

另外,爲了記錄,我嘗試了'int [] [] jagged = new [] {arr1,arr2,arr3};'但我得到的是一個int [3] [](第二維未初始化)和前3個項目是數組。可能剛剛完成了'int [] jagged = new [] {arr1,arr2,arr3};' – Alain

+0

公平點,在這種情況下答案是否定的,沒有辦法以這種方式初始化多維數組完全使用數組初始化語法:( – MattDavey

0

我很努力地完全理解你真正想要達到的目標。如果我說得對,你有一些「列表」的字符串,你需要存儲在另一個列表中。

首先,我建議你使用比數組更現代的方法。 C#爲您提供IEnumerable和IList <>接口以及從它們派生的所有東西,因此不需要使用老式的數組。如果要訪問「foo6」你寫

var list1 = new List<string> { "foo1", "foo2", "foo3" }; 
var list2 = new List<string> { "foo4", "foo5", "foo6" }; 
var list3 = new List<string> { "foo7", "foo8", "foo9" }; 
var listOfStrings = new List<List<string>> { list1, list2, list3 }; 

然後:

var temp = listOfStrings[1][2]; 
+0

的形式實現,因爲何時數組是老式的? .NET中幾乎所有的集合類都比裝飾好的數組稍微多一些.. – MattDavey

+0

我以字符串爲例。我正在嘗試組合一個二維數組對象。不是數組的一維數組。 – Alain

1

您正在試圖數組引用分配給數組

你可以做這樣的事情。欲瞭解更多詳情,請閱讀 - Jagged Arrays.

試試這個,

Object[] first = new Object[] { "00", "01", "02" }; 
Object[] second = new Object[] { "10", "11", "12" }; 
Object[] third = new Object[] { "20", "21", "22" }; 
Object[][] result = { first, second, third }; 

foreach (object [] ar in result) 
    { 
     foreach (object ele in ar) 
     { 
      Console.Write(" " + ele); 
      } 
     Console.WriteLine(); 
    }