Как я могу создать коллекцию ссылок в C # - PullRequest
1 голос
/ 13 мая 2010

Хорошо, у меня сбой между языками. В C # это отличные коллекции, такие как List и У меня есть:

Класс карты со свойствами:
List<code><byte[]> Изображения;
Список <Tile> Плитка;

Класс плитки:
byte[] ImageData;<br> int X;<br> int Y;

Теперь я хочу добавить изображение в класс Map и иметь свойство ImageData классов Tile, чтобы «ссылаться» на него. Я обнаружил, что не могу просто назначить это изображения [0]. У вас не может быть ссылки на объект списка.

Мое исправление заключалось в создании словаря. Это лучший способ или я могу как-то иметь «указатель» на коллекцию объектов?

  • в ответ на комментарии, если у меня есть набор плиток, у которых есть imagedata, указывающие на первый байтовый массив в Списке, а затем я изменяю это изображение в списке и беру изображение в Tiles, и они являются предыдущим назначением изображения. Поэтому назначьте плиткам первое изображение в списке, а затем измените это изображение, и теперь я ожидаю, что плитка будет ссылаться на новое изображение. Они не.

ЗАКЛЮЧИТЕЛЬНОЕ ПЕРЕСМОТР - Посмотрите на код gladford3x (я еще не освоил форматирование). последняя строка в Main будет
myMap.Images [0] = image2;
хорошо, когда вы вызываете myMap.Tiles [0] .ImageData, он будет иметь данные из первого байтового массива

Ответы [ 4 ]

1 голос
/ 13 мая 2010

Я думаю, что это правильный путь

Использование именованной коллекции в классе карты

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 голосов
/ 13 мая 2010

Проблема здесь в том, что ваша Карта управляет изображениями, но плитки используют их. Если я правильно понимаю, вы не хотите, чтобы Tiles знали о карте, поэтому вы предпочитаете ссылаться на изображение напрямую. В этом случае вы можете создать класс TileImage, содержащий данные изображения. Вы сохраняете коллекцию экземпляров TileImage на своей карте и передаете TileImage в каждую плитку. Теперь у вас есть ссылка, которая остается неизменной для данной плитки. Если вы хотите изменить изображение для этого типа плитки, вы теперь обновите содержимое изображения TileImage. Это создает уровень косвенности, к которому вы стремитесь.


public class TileImage
{
    public byte[] ImageData;
}

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

В реальном коде, конечно, вы должны инкапсулировать со свойствами и в идеале сделать объекты неизменяемыми, где это возможно.

0 голосов
/ 13 мая 2010

Я не уверен, что полностью понимаю. Я перечитал вопрос несколько раз, и вот что я придумал. Следующее, кажется, работает нормально для меня. Я бы рекомендовал использовать это в качестве доказательства концепции и реализовать соответствующие интерфейсы, такие как ICollection, IEnumerator, IList или любой другой, который будет отвечать вашим потребностям.


EDIT:

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 голосов
/ 13 мая 2010

Теперь я хочу добавить изображение в класс Map и иметь свойство 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), однако он хранится в куче, поэтому вам не нужно беспокоиться об управлении указателями.

...