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

时间:2010-05-12 23:07:19

标签: c# collections reference

好的我正在进行交叉语言打嗝。在C#中它有很棒的集合,如List和 我有:

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

瓷砖类:
    <byte[]>

现在我想将一个图像添加到Map类中,并使用Tile Classes的ImageData属性来“引用”它。我发现我不能只为它分配图像[0]。您不能引用List的对象。

我的解决方法是创建一个词典。这是最好的方法还是我能以某种方式拥有一个对象集合的“指针”?

  • 作为对评论的回应,如果我有一堆瓷砖,其中imagedata指向List中的第一个字节数组,然后我在列表中更改该图像并抓取Tiles中的图像,它们是之前的图像分配。因此,指定切片以使列表中的第一个图像,然后更改该图像,我现在期望切片sot引用新图像。他们没有。

最终修订 - 看看gladford3x的代码(我还没有掌握格式化)。 Main的最后一行将是
  myMap.Images [0] = image2;
好吧,当你调用myMap.Tiles [0] .ImageData时,它将拥有来自第一个字节数组的数据

4 个答案:

答案 0 :(得分:1)

我认为这是正确的方式

在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;

是你在做什么?

答案 1 :(得分:0)

现在我想在Map类中添加一个图像,并让Tile Classes的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)但是它存储在堆上,因此您不必担心指针管理。

答案 2 :(得分: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; 
} 

答案 3 :(得分:0)

这里的问题是你的地图管理图像,但是瓷砖使用它们。如果我理解正确,你不希望Tiles知道Map,所以你更喜欢直接引用Image。在这种情况下你可以做的是创建一个包含Image数据的TileImage类。您在Map中保留了TileImage实例的集合,并将TileImage传递给每个Tile。现在,您有一个针对给定Tile保持固定的引用。如果要更改该类型图块的图像,现在可以更新TileImage的图像内容。这创造了你所追求的间接水平。


public class TileImage
{
    public byte[] ImageData;
}

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

在实际代码中,当然,您应该使用属性进行封装,并在理想情况下尽可能使其不可变。