2010-05-12 52 views
1

好吧,我正在發生跨語言呃逆。在C#與它的人類羣體像列表和 我:如何在C中創建一個引用集合#

一個Map類的屬性:
List<byte[]>圖像;
列表<Tile>瓷磚;

的瓷磚類:
byte[] ImageData;
int X;
int Y;

現在我想將圖像添加到地圖類,並有瓷磚類爲「參考」,它的圖象 - 屬性。我發現我不能將它分配給Images [0]。您無法引用List的對象。

我的修復是創建一個詞典。這是最好的方式還是我可以以某種方式有一個「指針」的對象集合?

  • 響應意見,如果我有一堆已經圖象 - 指向第一個字節數組中的列表,然後我改變這種形象在列表中,並搶在瓷磚的圖像塊,他們都是以前的圖像分配。因此,將圖塊分配到列表中的第一個圖像,然後更改該圖像,現在我希望圖塊引用新圖像。他們不。

FINAL REVISION - 看看gladford3x的代碼(我還沒有掌握格式化)。 Main中的最後一行將是
myMap.Images [0] = image2;
以及當你調用myMap.Tiles [0] .ImageData將有數據從第一字節數組

+0

我不遵循你想要的。如果將Tile對象添加到列表中,那麼您將擁有一個引用列表,因爲Tile是引用類型。你能舉一個你想做什麼的代碼示例嗎? – galford13x 2010-05-12 23:22:36

+0

我不確定你在這裏做什麼。 'Images [0]'完全可以工作。另外,「指向一組對象的指針」部分有點令人困惑:「this.Images' *實際上就是這樣一個指針。 – Jon 2010-05-12 23:23:26

+2

你是否在談論改變存儲在Images [0]上的圖像,並使用該圖像反映更改?如果是這樣,您可以傳遞索引而不是圖像數據,並在需要檢索實際圖像時使用地圖。即而不是存儲ImageData,存儲ImageIndex。 – 2010-05-12 23:33:37

回答

1

我認爲這是去

地圖類中使用的命名集合的正確方法

public class Map 
{ 
    public List<byte[]> Images; 
    public Dictionary<int, Tile> Tiles;//you could use an int or a string to name the item 
} 

,所以你可以設置圖像數據:

Map yourMap = new Map(); 
yourMap.Tile[0].ImageData = yourByteArray; 

的是,你在做什麼?

0

現在我想將圖像添加到地圖類,並有瓷磚類的圖象 - 屬性爲「參考」,它

List<Map> list = new List<Map>(); 
list.Add(new Map()); 
list[0].ImageData = new byte[]; 

// Access the list later on, the same Map object is referenced. 

它是引用類型,以便將更新。您可以複製列表並且原始參考仍將更新。該類包含一個值類型(您的字節數組ImageData),但它存儲在堆中,因此您不必擔心指針管理。

0

我不確定我完全理解。我幾次閱讀這個問題,這是我想出的。以下似乎對我來說工作得很好。我建議將其用作概念驗證並實現適當的接口,如ICollection,IEnumerator,IList或任何可滿足您需求的接口。


編輯:

static void Main(string[] args) 
{ 
    Map myMap = new Map(); 
    myMap.Images = new List<byte[]>(); 
    myMap.Tiles = new List<Tile>(); 

    byte[] image = new byte[] { 1, 2, 3 }; 
    byte[] image2 = new byte[] { 10, 20, 30 }; 
    myMap.Add(image); 
    myMap.Add(image2); 

    byte[] image3 = new byte[] {100,200,255}; 
    myMap[0]=image3; 

    printallmaps(myMap); 
    myMap.Tiles.ForEach(c=>printall(c)); 
} 


public class Map 
{ 
    public List<byte[]> Images { get; set; } 
    public byte[] this[int i] 
    { 
     get 
     { 
      return Tiles[i].ImageData; 
     } 
     set 
     { 
      if(i >= this.Count) 
      { 
       this.Insert(i,value); 
      } 
      else 
      { 
       Tiles[i].ImageData = value; 
      } 
     } 
    } 
    public List<Tile> Tiles { get; set; } 
    public int Count {get {return Tiles.Count;}} 
    public void Add(byte[] image) 
    { 
     this[this.Count] = image; 
    } 
    public void Insert(int x, byte[] image) 
    { 
     Tile tile = new Tile(); 
     tile.ImageData = image; 
     Tiles.Insert(x,tile); 
    } 
} 

public class Tile 
{ 
    public byte[] ImageData; 
    int x; 
    int y; 
} 
+0

好吧,你缺少的部分是添加一條線在主要更改myMap.Images [0]中的圖像現在,第一個瓷磚將不會更改它的圖像 – 2010-05-12 23:50:52

+0

我不確定索引器是否是一個選項。但是如果你可以在Map上實現你自己的索引器,那麼你可以直接使用它來訪問Tiles。我把上面的編輯。 – galford13x 2010-05-13 14:43:46

0

這裏的問題是,你的地圖管理圖像,但是瓷磚使用它們。如果我理解正確,你不希望Tiles知道地圖,所以你更願意直接引用圖像。在這種情況下你可以做的是創建一個包含圖像數據的TileImage類。您在Map中保存TileImage實例的集合,並將TileImage傳遞給每個Tile。現在你有一個參考,對於給定的Tile保持固定。如果您想更改該類型圖塊的圖像,則現在更新TileImage的圖像內容。這會創建你之後的間接級別。


public class TileImage 
{ 
    public byte[] ImageData; 
} 

public class Tile 
{ 
    public TileImage Image; 
    int x; 
    int y; 
} 

在實際的代碼,當然,你應該特性封裝和理想使事情一成不變如果可能的話。

相關問題