簡體   English   中英

如何在C#中創建引用集合

[英]How can I create a collection of references in C#

好吧,我正在跨語言打h。 在C#中,它具有像List這樣的很棒的集合,我有:

具有以下屬性的Map類:
List <byte[]> Images;
List <Tile> Tiles;

圖塊類別:
byte[] ImageData;
int X;
int Y;

現在,我想向Map類添加圖像,並讓Tile類的ImageData屬性“引用”它。 我發現我不能只為其分配圖像[0]。 您不能引用列表的對象。

我的解決方法是創建字典。 這是最好的方法還是我可以以某種方式為對象集合提供“指針”?

  • 作為回應,如果我有一堆瓦片,其圖像數據指向列表中的第一個字節數組,然后我更改列表中的圖像,並在瓦片中獲取圖像,它們就是先前的圖像分配對象。 因此,將圖塊分配為列表中的第一個圖像,然后更改該圖像,現在我希望圖塊可以引用新圖像。 他們沒有。

最終修訂-看一下gladford3x的代碼(我還沒有掌握格式設置)。 Main的最后一行是
myMap.Images [0] = image2;
好,當您調用myMap.Tiles [0] .ImageData時,它將具有來自第一個字節數組的數據

我認為這是正確的方法

在Map類中使用命名集合

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;

那是你在做什么嗎?

現在,我想向Map類添加圖像,並讓Tile類的ImageData屬性“引用”它

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 ),但是該類型存儲在堆中,因此您無需擔心指針管理。

我不確定我是否完全理解。 我讀了幾次這個問題,這就是我的想法。 以下似乎對我來說很好。 我建議將其用作概念證明,並實現適當的接口,例如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; 
} 

這里的問題是您的地圖管理圖像,而圖塊使用它們。 如果我理解正確,則您不希望Tiles知道地圖,因此您希望直接引用Image。 在這種情況下,您可以做的是創建一個包含Image數據的TileImage類。 您在地圖中保留了TileImage實例的集合,並將TileImage傳遞給每個Tile。 現在,您有了對於給定圖塊保持不變的參考。 如果要更改該圖塊類型的圖像,現在可以更新TileImage的圖像內容。 這將創建您需要的間接級別。


public class TileImage
{
    public byte[] ImageData;
}

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

當然,在實際代碼中,您應該封裝屬性,理想情況下,使屬性保持不變。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM