2009-12-21 118 views
4

如何定義二維動態數組? 如果我想使用列表<>,我可以在兩個維度使用它嗎?定義二維動態數組

+0

請告訴我們更詳細的情況。當你不需要二維數組時,有一些情況,但是字典或類似的東西。 – serhio 2009-12-21 10:32:24

回答

10

沒有我意識到的二維數組的內置動態等價物,但您可以輕鬆獲得或多或少相同的功能。

定義座標類此API:

public class Coordinate : IEquatable<Coordinate> 
{ 
    public Coordinate(int x, int y); 
    public int X { get; } 
    public int Y { get; } 
    // override Equals and GetHashcode... 
} 

現在,您可以創建這些座標實例的集合。

如果您創建一個HashSet<Coordinate>您將得到保證,如果它已被添加,則不能添加座標,因爲它會覆蓋Equals。

如果你願意,你可以展開協調,以Coordinate<T>這樣的:

public class Coordinate<T> //... 
{ 
    // previous stuff... 

    public T Item { get; set; } 
} 

這將讓你與每個座標強類型項目相關聯,就像這樣:

var items = new HashSet<Coordinate<string>>(); 
items.Add(new Coordinate<string>(1, 4) { Item = "Foo" }); 
items.Add(new Coordinate<string>(7, 19) { Item = "Foo" }); 
// ... 
+0

嘿,我喜歡這個:) – 2009-12-21 10:47:41

+1

我試過這個解決方案,我不知道它是因爲事情在更新版本的c#中發生了變化,但這些都是我得到的錯誤。(座標)' 以及'Coordinate.Coordinate(int,int)'必須聲明一個實體,因爲它沒有被標記爲抽象,外部或者部分' 以及'使用泛型類型'座標<>'需要1個類型參數' – Edward 2016-09-20 22:52:53

1

你應該看看這裏:Arrays Tutorial in C#。無論如何,這裏的語法是:type[,] name用於多維數組,type[][] name用於鋸齒形數組(更改type表示要存儲在數組中的對象的類型)。

+2

聲明後如何添加到數組中? – 2011-10-07 13:45:01

1

這將是這樣的:

List<List<string>> twoDimensional = new List<List<string>>(); 

但我認爲這是不切實際的,使用這樣的列表,更好地訴諸陣列...

+0

這只是一個列表清單。不是二維的。 – leppie 2009-12-21 10:31:00

+0

-1這相當於鋸齒陣列,而不是二維數組。 – 2009-12-21 10:34:12

+0

嗯,你是對的....我們應該有更多的信息在問題的背景下,爲什麼他需要它等。 – 2009-12-21 10:37:18

0

隨着你不能陣列,他們從來沒有'動態'。

使用列表你不能(除非你通過提供一個額外的索引器使它看起來像一個),除非你只是尋找列表(這不是多維的)。

這將是(對字符串列表的列表):

List<List<string>> 
2

可以使用例如列表List>和c#中的列表非常快。

但兩d數組,你需要這樣的東西:

int[,] arr = new int[100,100]; 

,這應該是超過列表更快。