好的我正在进行交叉语言打嗝。在C#中它有很棒的集合,如List和 我有:
具有以下属性的Map类:
List
<byte[]>
Images;
List<Tile>
Tiles;
瓷砖类:
<byte[]>
现在我想将一个图像添加到Map类中,并使用Tile Classes的ImageData属性来“引用”它。我发现我不能只为它分配图像[0]。您不能引用List的对象。
我的解决方法是创建一个词典。这是最好的方法还是我能以某种方式拥有一个对象集合的“指针”?
最终修订 - 看看gladford3x的代码(我还没有掌握格式化)。 Main的最后一行将是
myMap.Images [0] = image2;
好吧,当你调用myMap.Tiles [0] .ImageData时,它将拥有来自第一个字节数组的数据
答案 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;
}
在实际代码中,当然,您应该使用属性进行封装,并在理想情况下尽可能使其不可变。