2017-09-07 1 views
-3

J'ai créé une liste d'objets à l'aide d'une ligne de C# comme ceci:Interrogation objet sans nom donné

gameObjects.Add(new Object()); 

J'ai aussi fait une fonction qui imprime à l'écran une liste des types d'objets contenus dans GameObjects .

for(int i = 0; i < gameObjects.Count; i++) 
    Console.WriteLine(gameObjects[i].GetType()); 

Jusqu'ici tout va bien. Cependant, je reçois plus d'éléments imprimés sur l'écran que ce qui devrait être présent dans gameObjects, donc j'ai essayé de trouver un moyen de savoir si l'une des entrées est en double car je ne trouve rien dans mon code pourrait créer des objets supplémentaires dans la liste. Ce serait génial si je pouvais imprimer les noms de chaque objet dans la liste, mais comme je ne leur ai pas donné de noms, je ne pense pas que ce soit possible. Y a-t-il autre chose qui différencierait un objet de la liste d'un autre dont je pourrais profiter? Comme c'est juste le débogage, je ne voulais pas vraiment entrer et m'assurer que chaque objet porte un nom.

Merci!

Edit:

Pour ceux qui demandent plus de code, j'ai une fonction qui ajoute des objets de type staticObject à la liste des GameObjects:

private void CreateStaticObject(Vector2 v2StaticObjectPosition) 
     { 
      Texture2D staticObjectTexture = Content.Load<Texture2D>(@"textures\StaticObject"); 
      GameInfo.gameInfo.gameObjects.Add(new StaticObject(staticObjectTexture, v2StaticObjectPosition, sbSpriteBatch)); 
     } 

La liste est contenue dans une classe appelée GameInfo. Chaque StaticObject hérite d'une classe Sprite, si c'est important.

ajouter également un objet de joueur à la liste, qui hérite de la classe StaticObject:

private void CreatePlayer(Vector2 v2PlayerPosition) 
     { 
      Texture2D playerTexture = Content.Load<Texture2D>(@"textures\Player1"); 
      player1 = new Player(playerTexture, v2PlayerPosition, sbSpriteBatch); 
     } 

Je puis imprimer le contenu de la liste avec ceci:

for(int i = 0; i < GameInfo.gameInfo.gameObjects.Count; i++) 
      { 
       string sObjectString = string.Format("Game object {0} is a {1}", i, GameInfo.gameInfo.gameObjects[i].GetType()); 
       DrawWithShadow(sObjectString, new Vector2(10, 20 * i + 10)); 
      } 

DrawWithShadow() est juste une méthode simple qui met en forme le texte sur l'écran à l'endroit désiré. Malheureusement cependant, pour chaque objet que je crée en appelant la méthode CreateStaticObject(), je me retrouve avec deux entrées dans ma liste.

+1

Il serait vraiment utile de voir plus de votre code ... – maccettura

+2

définir "doublons", voulez-vous dire deux références à la même instance? ou vos objets contiennent-ils réellement des données avec lesquelles travailler? – DrNachtschatten

+2

Infos pour reproduire votre problème serait bien. – LuckyLikey

Répondre

0

Merci pour toutes les suggestions les gars. Cependant j'ai découvert la source de mon problème. J'avais une ancienne ligne de code dans le constructeur pour la classe StaticObject qui ajoute tout StaticObject créé à la liste. Donc j'ajoutais chaque objet deux fois. D'oh!: S

2

Mis à jour parce que j'étais stupide, ReferenceEquals vérifie l'égalité de référence.

Avez-vous essayé Object.ReferenceEquals()? Il vous dira si la référence a et la référence b pointent vers le même objet.

 var x = new object(); 

     var y = x; 

     //This will print "true" 
     Console.WriteLine(Object.ReferenceEquals(x,y)); 

Si vous voulez juste pour filtrer les dupes de la liste, essayez ceci:

gameObjects = gameObjects.Distinct().ToList(); 
1

Vous pouvez utiliser GroupBy pour trouver tous les objets en double en utilisant l'égalité de référence:

var duplicateGroups = gameObjects.GroupBy(obj => obj).Where(g => g.Count() > 1); 

Notez que les méthodes Equals + GetHashCode de l'objet seront utilisées si elles sont remplacées.