[英]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.