我使用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()方法创建的每个对象,我最终在列表中有两个条目。
答案 0 :(得分: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 :(得分:1)
您可以使用GroupBy
使用引用相等性来查找所有重复的对象:
var duplicateGroups = gameObjects.GroupBy(obj => obj).Where(g => g.Count() > 1);
请注意,如果被覆盖,这将使用对象的Equals
+ GetHashCode
方法。
答案 2 :(得分:0)
感谢所有人的建议。但是我发现了问题的根源。我在StaticObject类的构造函数中有一行旧代码,它将任何创建的StaticObject添加到列表中。所以我每次添加两个对象。 D'哦! :S