2017-09-07 9 views
-3

与えられた名前なしオブジェクトの照会。私はこのようなC#ラインを使用してオブジェクトのリストを作成している

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

これまでのところとても良いです。しかし、私はgameObjectsに存在するはずのものよりも多くのアイテムを画面に表示していますので、私のコードで何も見つけられないので、エントリが重複しているかどうかを調べる方法を試しています。リストに余分なオブジェクトを作成している可能性があります。リスト内の各オブジェクトの名前を印刷することができれば幸いですが、名前を付けていないので、これは可能ではないと思います。リストの中の1つのオブジェクトと、他のものとを区別できるものは他にありますか?それはちょうどデバッグであるので、私は実際に入って、各オブジェクトに名前が付いていることを確認する必要はありませんでした。

ありがとうございます!

編集:

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

リストはGameInfoのと呼ばれるクラス内に含まれています。より多くのコードを求める人のために

、私はゲームオブジェクトのリストにタイプstaticObjectのオブジェクトを追加する機能を持っています。各StaticObjectはSpriteクラスを継承しています(重要な場合)。

私はまたStaticObjectクラスから継承するリストにPlayerオブジェクトを追加:

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:私は、これでリストの内容をプリントアウトしてい

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

()は、画面上のテキストを目的の場所にうまくフォーマットする簡単な方法です。残念ながら、CreateStaticObject()メソッドを呼び出して作成したオブジェクトごとに、リストに2つのエントリがあります。

+1

本当にあなたのコードの多くを見るのに役立ちます... – maccettura

+2

"duplicates"を定義すると、同じインスタンスへの2つの参照を意味しますか?あなたのオブジェクトには実際に使用するデータが含まれていますか? – DrNachtschatten

+2

問題を再現するための情報がうまくいくはずです。 – LuckyLikey

答えて

0

すべてのご意見ありがとうございます。しかし、私は自分の問題の原因を発見しました。作成したStaticObjectをリストに追加するStaticObjectクラスのコンストラクタに古いコード行がありました。そこで私は各オブジェクトを2回追加していました。 D'oh!:S

2

私が愚かであったため、ReferenceEqualsは参照の平等をチェックします。

Object.ReferenceEquals()を試したことがありますか?参照aと参照bが同じオブジェクトを指しているかどうかを示します。

 var x = new object(); 

     var y = x; 

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

あなただけのリストからdupesをフィルタリングする場合は、これを試してみてください。

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

あなたは参照の等価を使用して、すべての重複したオブジェクトを見つけるためにGroupByを使用することができます。

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

オーバーライドされている場合は、オブジェクトのEquals + GetHashCodeメソッドを使用することに注意してください。

関連する問題