查询没有给定名称的对象
Querying object without a given name
我使用 C# 行创建了一个对象列表,如下所示:
gameObjects.Add(new Object());
我还制作了一个函数,可以在屏幕上打印游戏对象中包含的对象类型列表。
for(int i = 0; i < gameObjects.Count; i++)
Console.WriteLine(gameObjects[i].GetType());
到目前为止一切顺利。但是,我在屏幕上打印的项目多于 gameObjects 中应有的项目,因此我一直在尝试找出一种方法来确定是否有任何条目重复,因为我在代码中找不到任何内容可能会在列表中创建额外的对象。如果我可以打印出列表中每个对象的名称,那就太好了,但由于我没有给它们命名,所以我认为这是不可能的。是否还有其他任何东西可以将列表中的一个对象与我可以利用的另一个对象区分开来?因为它只是调试,所以我真的不想进入并确保每个对象都被赋予了名称。
谢谢!
编辑:
对于那些需要更多代码的人,我有一个函数可以将 staticObject 类型的对象添加到游戏对象列表中:
private void CreateStaticObject(Vector2 v2StaticObjectPosition)
{
Texture2D staticObjectTexture = Content.Load<Texture2D>(@"textures\StaticObject");
GameInfo.gameInfo.gameObjects.Add(new StaticObject(staticObjectTexture, v2StaticObjectPosition, sbSpriteBatch));
}
该列表包含在一个名为 GameInfo 的 class 中。每个 StaticObject 都继承自 Sprite class,如果这很重要的话。
我还在列表中添加了一个 Player 对象,它继承自 StaticObject class:
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() 方法创建的每个对象,我最终在列表中有两个条目。
更新是因为我笨,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();
您可以使用 GroupBy
通过引用相等性查找所有重复对象:
var duplicateGroups = gameObjects.GroupBy(obj => obj).Where(g => g.Count() > 1);
请注意,这将使用对象的 Equals
+ GetHashCode
方法(如果它们被覆盖)。
感谢大家提出的所有建议。但是我发现了问题的根源。我在 StaticObject class 的构造函数中有一行旧代码,它将任何创建的 StaticObject 添加到列表中。所以我将每个对象添加了两次。哦! :S
我使用 C# 行创建了一个对象列表,如下所示:
gameObjects.Add(new Object());
我还制作了一个函数,可以在屏幕上打印游戏对象中包含的对象类型列表。
for(int i = 0; i < gameObjects.Count; i++)
Console.WriteLine(gameObjects[i].GetType());
到目前为止一切顺利。但是,我在屏幕上打印的项目多于 gameObjects 中应有的项目,因此我一直在尝试找出一种方法来确定是否有任何条目重复,因为我在代码中找不到任何内容可能会在列表中创建额外的对象。如果我可以打印出列表中每个对象的名称,那就太好了,但由于我没有给它们命名,所以我认为这是不可能的。是否还有其他任何东西可以将列表中的一个对象与我可以利用的另一个对象区分开来?因为它只是调试,所以我真的不想进入并确保每个对象都被赋予了名称。
谢谢!
编辑:
对于那些需要更多代码的人,我有一个函数可以将 staticObject 类型的对象添加到游戏对象列表中:
private void CreateStaticObject(Vector2 v2StaticObjectPosition)
{
Texture2D staticObjectTexture = Content.Load<Texture2D>(@"textures\StaticObject");
GameInfo.gameInfo.gameObjects.Add(new StaticObject(staticObjectTexture, v2StaticObjectPosition, sbSpriteBatch));
}
该列表包含在一个名为 GameInfo 的 class 中。每个 StaticObject 都继承自 Sprite class,如果这很重要的话。
我还在列表中添加了一个 Player 对象,它继承自 StaticObject class:
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() 方法创建的每个对象,我最终在列表中有两个条目。
更新是因为我笨,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();
您可以使用 GroupBy
通过引用相等性查找所有重复对象:
var duplicateGroups = gameObjects.GroupBy(obj => obj).Where(g => g.Count() > 1);
请注意,这将使用对象的 Equals
+ GetHashCode
方法(如果它们被覆盖)。
感谢大家提出的所有建议。但是我发现了问题的根源。我在 StaticObject class 的构造函数中有一行旧代码,它将任何创建的 StaticObject 添加到列表中。所以我将每个对象添加了两次。哦! :S