2017-09-07 81 views
-3

我已經用C#線這樣創建的對象的列表中給定的名稱:查詢對象,而

gameObjects.Add(new Object()); 

我也提出,在屏幕上打印包含gameObjects內的對象類型的列表功能。

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

到目前爲止好。不過,我在屏幕上顯示的內容應該比gameObjects中顯示的要多,因此我一直在試圖找出一種方法來查明是否有任何條目是重複的,因爲我在代碼中找不到任何內容可能會在列表中創建額外的對象。如果我能打印出列表中每個對象的名字,那將是非常棒的,但是因爲我沒有給出它們的名字,所以我認爲這是不可能的。還有什麼可以區分列表中的一個對象和我可以利用的另一個對象嗎?因爲它只是調試,所以我不想進入,並確保每個對象都有一個名稱。

謝謝!

編輯:

對於那些要求更多的代碼,我有一個功能,增加了類型staticObject的對象到gameObjects列表:

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

名單載一個名爲GameInfo類中。如果重要的話,每個StaticObject繼承自一個Sprite類。

我還添加了一個Player對象的名單,從StaticObject類繼承:

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

我然後打印出清單的內容與此:

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 ()只是一個簡單的方法,它很好地在屏幕上的所需位置格式化文本。不幸的是,對於通過調用CreateStaticObject()方法創建的每個對象,我最終在列表中有兩個條目。

+1

這將真正有助於看到更多的代碼... – maccettura

+2

定義「重複」,你的意思是兩個引用同一個實例嗎?或者你的對象實際上是否包含一些可以使用的數據? – DrNachtschatten

+2

重現您的問題的信息會很好。 – LuckyLikey

回答

0

感謝所有的建議傢伙。但是我發現了我的問題的根源。我在StaticObject類的構造函數中有一行舊代碼,它將任何創建的StaticObject添加到列表中。所以我加了兩個對象。 D'哦!:S

2

更新,因爲我笨,ReferenceEquals檢查參考平等。

你試過Object.ReferenceEquals()嗎?它會告訴你如果引用a和引用b指向同一個對象。

 var x = new object(); 

     var y = x; 

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

如果你只是要過濾的受騙者淘汰之列,試試這個:

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

可以使用GroupBy通過參考平等找到所有重複的對象:

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

請注意,如果它們被覆蓋,這將使用對象的Equals + GetHashCode方法。