2010-05-12 6 views
1

Ok J'ai un hoquet de langue croisée. En C# avec ses grandes collections comme liste et je :Comment puis-je créer une collection de références en C#

une classe de la carte avec des propriétés de:
List<byte[]> Images;
Liste <Tile> Carreaux;

une classe de carreaux:
byte[] ImageData;
int X;
int Y;

Maintenant, je veux ajouter une image à la classe de la carte et ont la propriété ImageData des classes de tuiles de « référence » it. J'ai découvert que je ne peux pas simplement lui assigner des Images [0]. Vous ne pouvez pas avoir de référence à un objet d'une liste.

Mon problème était de créer un dictionnaire. Est-ce le meilleur moyen ou puis-je avoir un "pointeur" sur une collection d'objets?

  • en réponse aux commentaires si j'ai un tas de tuiles qui ont imageData pointant vers le premier tableau d'octets dans la liste puis-je modifier cette image dans la liste et saisir l'image dans les carreaux et ils sont l'ancien image assignemnt. Donc assigner des tuiles pour avoir la première image dans la liste, puis changer cette image, je m'attends maintenant à ce que la mosaïque fasse référence à la nouvelle image. Ils ne le font pas.

RÉVISION FINALE - Regardez le code de gladford3x (je n'ai pas encore maîtrisé la mise en forme). la dernière ligne de Main sera
myMap.Images [0] = image2;
bien lorsque vous appelez les myMap.Tiles [0] .ImageData il aura les données du premier tableau d'octets

+0

Je ne suis pas ce que vous voulez. Si vous ajoutez des objets Tile à votre liste, vous obtiendrez une liste de références puisque Tile est un type de référence. Pouvez-vous donner un exemple de code de ce que vous voulez faire? – galford13x

+0

Je ne suis pas sûr de ce que vous essayez de faire ici. 'Images [0]' devrait fonctionner totalement. De plus, la partie "pointeur sur une collection d'objets" est un peu confuse: 'this.Images' * est pratiquement un tel pointeur. – Jon

+2

Parlez-vous de changer l'image stockée sur Images [0] et d'avoir des carreaux utilisant cette image reflètent le changement? Si c'est le cas, vous pouvez passer un index plutôt que les données d'image et utiliser la carte lorsque vous avez besoin de récupérer l'image réelle. C'est à dire. au lieu de stocker ImageData, stockez ImageIndex. –

Répondre

1

Je pense qu'il est la bonne façon d'aller

En utilisant une collection nommée dans la classe de la carte

public class Map 
{ 
    public List<byte[]> Images; 
    public Dictionary<int, Tile> Tiles;//you could use an int or a string to name the item 
} 

vous pouvez donc définir des données d'image:

Map yourMap = new Map(); 
yourMap.Tile[0].ImageData = yourByteArray; 

est que ce que vous faites?

0

Maintenant, je veux ajouter une image à la classe de la carte et ont la propriété ImageData des classes de tuiles de « référence » il

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. 

Il est un type de référence il mettra à jour. Vous pouvez copier la liste et la référence d'origine sera toujours mise à jour. La classe contient un type de valeur (votre tableau d'octets ImageData) mais stocké sur le tas, vous n'avez donc pas besoin de vous soucier de la gestion des pointeurs.

0

Je ne suis pas sûr de bien comprendre. J'ai relu la question à quelques reprises et voici ce que j'ai trouvé. Ce qui suit semble bien fonctionner pour moi. Je recommanderais de l'utiliser comme une preuve de concept et de mettre en œuvre les interfaces appropriées telles que ICollection, IEnumerator, IList ou tout ce qui répondra à vos besoins.


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

Ok la partie qui vous manque est d'ajouter une ligne dans le main qui change l'image dans myMap.Images [0] maintenant que la première tuile ne changera pas son image –

+0

Je ne suis pas sûr si les indexeurs sont une option. Mais si vous pouvez implémenter votre propre indexeur sur Map, vous pouvez l'utiliser pour accéder directement aux Tiles. Je mets dans l'édition ci-dessus. – galford13x

0

Le problème ici est que votre carte gère les images, mais les tuiles les utiliser. Si je comprends bien, vous ne voulez pas que les tuiles soient au courant de la carte, alors vous préférez référencer l'image directement. Dans ce cas, vous pouvez créer une classe TileImage contenant les données Image. Vous conservez une collection d'instances TileImage dans votre Map et transmettez une TileImage à chaque Tile. Maintenant, vous avez une référence qui reste fixe pour un carreau donné. Si vous voulez changer l'image pour ce type de tuile, vous devez maintenant mettre à jour le contenu de l'image de TileImage. Cela crée le niveau d'indirection que vous recherchez.


public class TileImage 
{ 
    public byte[] ImageData; 
} 

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

Dans le code réel, bien sûr, vous devez encapsuler avec des propriétés et de faire les choses parfaitement immuable lorsque cela est possible.

Questions connexes